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

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

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

Начать курс

Работа с изображениями в 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                    

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