Обработка изображений в Kotlin: resize и crop с библиотекой Kamel

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

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

Начать курс

Работа с изображениями в Kotlin: resize и crop с библиотекой Kamel

В современной разработке под Android и мультиплатформенные проекты на Kotlin часто возникает необходимость программно изменять размер (resize) и обрезать (crop) изображения. Это требуется для оптимизации загрузки, создания превью, адаптации под разные экраны или подготовки изображений для отправки на сервер. В этой статье мы рассмотрим библиотеку Kamel — мощный инструмент для работы с изображениями, написанный на чистом Kotlin и поддерживающий мультиплатформенность.

Что такое Kamel?

Kamel (Kotlin Asynchronous Media Loading) — это библиотека для загрузки, кэширования и обработки изображений, созданная специально для Kotlin Multiplatform. Она предоставляет простой API для выполнения таких операций, как resize и crop, без необходимости подключать тяжелые фреймворки вроде Glide или Picasso. Kamel поддерживает Android, iOS, JVM и JavaScript, что делает её идеальным выбором для кроссплатформенных проектов.

Установка библиотеки производится через Gradle:

// build.gradle.kts (commonMain)
implementation("media.kamel:kamel-image:1.0.0")

Изменение размера изображения (resize)

Операция resize позволяет изменить исходные размеры изображения до заданных ширины и высоты. В Kamel это реализовано через функцию resize(), которая принимает целевые размеры и способ масштабирования (scale mode).

Пример базового изменения размера:

import androidx.compose.runtime.*
import media.kamel.image.loadImage
import media.kamel.image.resizer.*

@Composable
fun ResizedImage() {
    val image = loadImage(
        data = "https://example.com/photo.jpg",
        resizer = Resizer(
            width = 300,
            height = 200,
            scaleMode = ScaleMode.Fit
        )
    )
    // Отображение image в Image composable
}

В этом примере изображение будет масштабировано до 300x200 пикселей с сохранением пропорций (ScaleMode.Fit). Если нужно растянуть изображение без сохранения пропорций, используйте ScaleMode.Fill или ScaleMode.Crop (последний автоматически обрезает края).

Обрезка изображения (crop)

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

  • Через ScaleMode.Crop — автоматическая обрезка при масштабировании;
  • Через ручное указание региона — с помощью класса ImageRegion.

Пример ручной обрезки:

import media.kamel.image.loadImage
import media.kamel.image.cropper.*

@Composable
fun CroppedImage() {
    val image = loadImage(
        data = "https://example.com/photo.jpg",
        cropper = Cropper(
            region = ImageRegion(
                left = 50,
                top = 50,
                width = 200,
                height = 150
            )
        )
    )
    // Отображение обрезанного изображения
}

Здесь из изображения вырезается область, начинающаяся с координат (50, 50) и имеющая размер 200x150 пикселей. Это полезно, когда нужно извлечь конкретную часть, например, лицо на фотографии.

Комбинирование resize и crop

Часто требуется выполнить обе операции последовательно: сначала обрезать, потом изменить размер. Kamel позволяет комбинировать их через цепочку вызовов:

@Composable
fun CombinedProcessing() {
    val image = loadImage(
        data = "https://example.com/photo.jpg",
        resizer = Resizer(width = 400, height = 300, scaleMode = ScaleMode.Fit),
        cropper = Cropper(region = ImageRegion(100, 100, 600, 450))
    )
}

Порядок выполнения: сначала применяется Cropper, затем Resizer. Это гарантирует, что обрезка происходит на исходном изображении, а resize — уже на обрезанном фрагменте.

Практический пример: создание квадратного превью

Частая задача — создать квадратное превью из прямоугольного изображения. Решим её с помощью Kamel:

@Composable
fun SquareThumbnail() {
    val preview = loadImage(
        data = "https://example.com/large_photo.jpg",
        resizer = Resizer(
            width = 150,
            height = 150,
            scaleMode = ScaleMode.Crop  // Автоматически обрезает до квадрата
        )
    )
    // preview — квадратное изображение 150x150
}

Благодаря ScaleMode.Crop библиотека сама выберет центральную область и обрежет лишнее, сохранив пропорции.

Преимущества использования Kamel

  • Мультиплатформенность

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