Работа с изображениями в 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
- Мультиплатформенность