Работа с изображениями в Kotlin: библиотеки, инструменты и примеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с изображениями в Kotlin: обзор библиотек и практические примеры

Kotlin — современный язык программирования, работающий поверх JVM. Благодаря полной совместимости с Java, для обработки изображений можно использовать все стандартные библиотеки Java, такие как javax.imageio, java.awt и javax.swing. В этой статье мы рассмотрим основные подходы к работе с изображениями на Kotlin: чтение, запись, изменение размера, применение фильтров и конвертацию форматов.

Необходимые библиотеки

Для работы с изображениями в Kotlin (JVM) не требуется устанавливать дополнительные зависимости — достаточно стандартной библиотеки JDK. Однако для более сложных задач (например, обработка больших изображений или работа с метаданными) могут потребоваться сторонние библиотеки:

  • java.awt.image.BufferedImage — основной класс для представления изображения в памяти.
  • javax.imageio.ImageIO — чтение и запись изображений в различных форматах (PNG, JPEG, BMP, GIF).
  • java.awt.Graphics2D — рисование и трансформации.
  • Thumbnailator (опционально) — упрощает изменение размера и создание миниатюр.
  • BoofCV (опционально) — библиотека компьютерного зрения с поддержкой Kotlin.

Чтение и запись изображений

Самый простой способ загрузить изображение — использовать ImageIO.read().

import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO

fun main() {
    // Чтение изображения
    val inputFile = File("input.jpg")
    val image: BufferedImage = ImageIO.read(inputFile) ?: throw Exception("Не удалось загрузить изображение")

    // Запись в другом формате
    val outputFile = File("output.png")
    ImageIO.write(image, "png", outputFile)

    println("Изображение сохранено: ${outputFile.absolutePath}")
}

Изменение размера изображения

Для изменения размера используем Graphics2D с параметрами сглаживания.

import java.awt.Graphics2D
import java.awt.RenderingHints
import java.awt.image.BufferedImage
import javax.imageio.ImageIO
import java.io.File

fun resizeImage(inputPath: String, outputPath: String, targetWidth: Int, targetHeight: Int) {
    val original: BufferedImage = ImageIO.read(File(inputPath))
    val resized = BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB)
    val g2d: Graphics2D = resized.createGraphics()

    // Включаем сглаживание для качественного масштабирования
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR)
    g2d.drawImage(original, 0, 0, targetWidth, targetHeight, null)
    g2d.dispose()

    ImageIO.write(resized, "jpg", File(outputPath))
    println("Изображение изменено: $outputPath")
}

fun main() {
    resizeImage("input.jpg", "resized.jpg", 800, 600)
}

Применение фильтров (размытие, контраст)

Для простых эффектов можно использовать BufferedImageOp (например, ConvolveOp для размытия).

import java.awt.image.BufferedImage
import java.awt.image.ConvolveOp
import java.awt.image.Kernel
import javax.imageio.ImageIO
import java.io.File

fun applyBlur(inputPath: String, outputPath: String) {
    val image: BufferedImage = ImageIO.read(File(inputPath))

    // Ядро размытия 5x5
    val size = 5
    val weight = 1.0f / (size * size)
    val kernelData = FloatArray(size * size) { weight }
    val kernel = Kernel(size, size, kernelData)
    val blurOp = ConvolveOp(kernel)

    val blurred = blurOp.filter(image, null)
    ImageIO.write(blurred, "jpg", File(outputPath))
}

fun main() {
    applyBlur("input.jpg", "blurred.jpg")
}

Конвертация форматов

Простое перекодирование между форматами (например, JPEG → PNG) с сохранением качества.

import javax.imageio.ImageIO
import java.io.File

fun convertFormat(inputPath: String, outputPath: String, format: String) {
    val image = ImageIO.read(File(inputPath))
    ImageIO.write(image, format, File(outputPath))
    println("Конвертация завершена: $outputPath")
}

fun main() {
    convertFormat("input.jpg", "output.png", "png")
}

Работа с прозрачностью (альфа-канал)

Для работы с PNG с прозрачностью используйте тип BufferedImage.TYPE_INT_ARGB.

import java.awt.Color
import java.awt.Graphics2D
import java.awt.image.BufferedImage
import javax.imageio.ImageIO
import java.io.File

fun createTransparentImage(width: Int,                    

Рекомендаций