Работа с изображениями в 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
Также в библиотеке
Генерация PDF отчётов на C++: библиотека libharu и не только
Email отправка на PHP: PHPMailer, SwiftMailer и mail() — полное руководство
node-cron: Планировщик задач для JavaScript (Node.js)