Работа с изображениями в Kotlin: обзор библиотек и практические примеры
Kotlin, будучи современным языком программирования, полностью совместимым с Java, предоставляет разработчикам доступ ко всей экосистеме библиотек для работы с изображениями. В этой статье мы рассмотрим основные инструменты, доступные в Kotlin для загрузки, обработки, преобразования и сохранения изображений. Вы узнаете, как использовать стандартные возможности Java (AWT, Swing) и специализированные библиотеки для решения типичных задач.
Стандартные средства Java AWT и Swing
Базовый функционал для работы с изображениями в Kotlin (как и в Java) предоставляют пакеты java.awt и javax.imageio. Основные классы:
java.awt.image.BufferedImage— представляет растровое изображение с доступом к пикселям.java.awt.Graphics2D— предоставляет методы для рисования (линии, фигуры, текст) на изображении.javax.imageio.ImageIO— статические методы для чтения и записи изображений в различных форматах (PNG, JPEG, BMP, GIF).java.awt.Color— работа с цветами.java.awt.image.RescaleOp,java.awt.image.ConvolveOp— фильтры для изменения яркости, контраста, размытия.
Пример 1: Загрузка, изменение размера и сохранение изображения
import java.awt.image.BufferedImage
import java.awt.Graphics2D
import java.awt.RenderingHints
import java.io.File
import javax.imageio.ImageIO
fun resizeImage(inputPath: String, outputPath: String, targetWidth: Int, targetHeight: Int) {
// Загрузка исходного изображения
val originalImage: BufferedImage = ImageIO.read(File(inputPath))
// Создание нового изображения заданного размера
val resizedImage = BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB)
val graphics: Graphics2D = resizedImage.createGraphics()
// Настройка качества ресемплинга
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR)
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)
// Рисование масштабированного изображения
graphics.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null)
graphics.dispose()
// Сохранение результата
ImageIO.write(resizedImage, "jpg", File(outputPath))
println("Изображение сохранено: $outputPath")
}
// Пример вызова
fun main() {
resizeImage("input.jpg", "output_resized.jpg", 800, 600)
}
Библиотека Thumbnailator
Thumbnailator — это популярная библиотека для Java/Kotlin, которая значительно упрощает создание миниатюр и изменение размеров изображений. Её главное преимущество — простой fluent API.
Подключение (Gradle):
implementation("net.coobird:thumbnailator:0.4.20")
Пример 2: Создание миниатюры с помощью Thumbnailator
import net.coobird.thumbnailator.Thumbnails
import java.io.File
fun createThumbnail(inputPath: String, outputPath: String, size: Int) {
Thumbnails.of(File(inputPath))
.size(size, size) // квадратная миниатюра
.keepAspectRatio(true) // сохранять пропорции
.outputFormat("png")
.toFile(File(outputPath))
println("Миниатюра создана: $outputPath")
}
fun main() {
createThumbnail("photo.jpg", "thumb.png", 150)
}
Библиотека также поддерживает кадрирование, поворот, добавление водяных знаков и работу с потоками.
Библиотека OpenCV для Kotlin
Для серьёзной компьютерной обработки изображений (распознавание лиц, фильтрация, анализ контуров) используется OpenCV. В Kotlin можно подключить официальный Java-биндинг.
Подключение (Gradle):
implementation("org.openpnp:opencv:4.9.0-0")
Пример 3: Преобразование изображения в оттенки серого с помощью OpenCV
import org.opencv.core.Core
import org.opencv.core.Mat
import org.opencv.imgcodecs.Imgcodecs
import org.opencv.imgproc.Imgproc
fun convertToGrayscale(inputPath: String, outputPath: String) {
// Загрузка библиотеки OpenCV (обязательно!)
System.loadLibrary(Core.NATIVE_LIBRARY_NAME)
// Чтение изображения
val source: Mat = Imgcodecs.imread