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

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

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

Начать курс

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

Kotlin — современный мультиплатформенный язык, который активно используется для разработки под JVM (Desktop), Android, а также в backend и мультиплатформенных проектах (KMP). Работа с изображениями — одна из частых задач, и в экосистеме Kotlin есть несколько подходов: от использования стандартных Java-библиотек до специализированных решений для Android и Kotlin Multiplatform. В этой статье разберём основные библиотеки и инструменты, покажем примеры кода и дадим практические рекомендации.

1. Встроенные средства: AWT (Java Desktop / JVM)

Для десктопных приложений на JVM (например, на JavaFX или Swing) удобнее всего использовать стандартный пакет java.awt и javax.imageio. Эти библиотеки доступны «из коробки» и позволяют загружать, изменять размер, конвертировать форматы и рисовать на изображениях.

Пример: загрузка, изменение размера и сохранение

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

fun resizeImage(inputPath: String, outputPath: String, newWidth: Int, newHeight: Int) {
    val original: BufferedImage = ImageIO.read(File(inputPath))
    val resized = BufferedImage(newWidth, newHeight, original.type)
    val g = resized.createGraphics()
    g.drawImage(original, 0, 0, newWidth, newHeight, null)
    g.dispose()
    ImageIO.write(resized, "jpg", File(outputPath))
    println("Изображение сохранено: $outputPath")
}

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

Для поворота, наложения водяных знаков или кадрирования можно использовать методы Graphics2D и аффинные преобразования.

2. Android: Bitmap и BitmapFactory

В Android-разработке на Kotlin основой для работы с изображениями является класс android.graphics.Bitmap и утилиты BitmapFactory. Они позволяют загружать изображения из ресурсов, файлов или сети, а также производить базовую обработку.

Пример: загрузка из ресурсов и изменение размера (Android)

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import java.io.ByteArrayOutputStream

fun scaleBitmap(bitmap: Bitmap, maxSize: Int): Bitmap {
    val width = bitmap.width
    val height = bitmap.height
    val scale = if (width > height) maxSize.toFloat() / width
                else maxSize.toFloat() / height
    val matrix = Matrix()
    matrix.postScale(scale, scale)
    return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true)
}

fun bitmapToByteArray(bitmap: Bitmap, quality: Int = 90): ByteArray {
    val stream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream)
    return stream.toByteArray()
}

Для более сложной обработки (фильтры, эффекты) можно использовать android.renderscript (устарел в API 31) или библиотеку OpenCV Android.

3. Kotlin Multiplatform (KMP): библиотека KVision или собственные решения

В мультиплатформенных проектах нет единого стандарта для работы с изображениями. Часто используются:

  • KVision — фреймворк для веб-приложений на Kotlin/JS, имеет встроенную поддержку работы с Canvas и ImageData.
  • Okio + ImageIO (JVM) / Bitmap (Android) — для KMP часто пишут expect/actual обёртки, где на каждой платформе используется своя реализация.
  • Skiko — библиотека от JetBrains для работы с графикой (Skia), доступна на JVM, JS и Native. Позволяет загружать, рисовать и экспортировать изображения.

Пример expect/actual для KMP:

// commonMain
expect fun loadImageBytes(path: String): ByteArray

// androidMain
actual fun loadImageBytes(path: String): ByteArray {
    val bitmap = BitmapFactory.decodeFile(path)
    val stream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
    return stream.toByteArray()
}

// jvmMain
actual fun loadImageBytes(path: String): ByteArray {
    val img = ImageIO.read(File(path))
    val baos = ByteArrayOutputStream()
    ImageIO.write(img, "png", baos)
    return baos.toByteArray()
}

4. Специализированные библиотеки для продвинутой обработки

Если вам нужны фильтры, распознавание лиц, OCR или сложные преобразования, стоит обратить внимание на следующие инструменты:

  • OpenCV (Java/Kotlin bindings) — мощная библиотека компьютерного зрения. Поддерживает JVM

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