Работа с изображениями в 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, Также в библиотеке
Rate Limiting в JavaScript (Node.js): Полное руководство по библиотеке express-rate-limit
Парсинг HTML в Java: библиотеки Jsoup и HtmlUnit
Koin — Dependency Injection контейнер для Kotlin
Обработка изображений в C# (.NET): библиотеки и примеры кода
Мониторинг приложений Go (Golang): библиотеки и инструменты