Trabalhando com imagens em Kotlin: resize e crop com a biblioteca Kamel
\n\nNo desenvolvimento moderno para Android e projetos multiplataforma em Kotlin, surge frequentemente a necessidade de redimensionar (resize) e cortar (crop) imagens programaticamente. Isso é necessário para otimizar o carregamento, criar pré-visualizações, adaptar para diferentes telas ou preparar imagens para envio ao servidor. Neste artigo, vamos explorar a biblioteca Kamel — uma ferramenta poderosa para trabalhar com imagens, escrita em Kotlin puro e com suporte a multiplataforma.
\n\nO que é Kamel?
\n\nKamel (Kotlin Asynchronous Media Loading) é uma biblioteca para carregamento, cache e processamento de imagens, criada especificamente para Kotlin Multiplatform. Ela fornece uma API simples para realizar operações como resize e crop, sem a necessidade de integrar frameworks pesados como Glide ou Picasso. Kamel suporta Android, iOS, JVM e JavaScript, tornando-a a escolha ideal para projetos multiplataforma.
A instalação da biblioteca é feita via Gradle:
\n\n// build.gradle.kts (commonMain)\nimplementation("media.kamel:kamel-image:1.0.0")\n\nRedimensionamento de imagem (resize)
\n\nA operação resize permite alterar as dimensões originais da imagem para uma largura e altura definidas. No Kamel, isso é implementado através da função resize(), que aceita as dimensões alvo e o modo de escala (scale mode).
Exemplo de redimensionamento básico:
\n\nimport androidx.compose.runtime.*\nimport media.kamel.image.loadImage\nimport media.kamel.image.resizer.*\n\n@Composable\nfun ResizedImage() {\n val image = loadImage(\n data = "https://example.com/photo.jpg",\n resizer = Resizer(\n width = 300,\n height = 200,\n scaleMode = ScaleMode.Fit\n )\n )\n // Exibição da image no Image composable\n}\n\nNeste exemplo, a imagem será redimensionada para 300x200 pixels mantendo a proporção (ScaleMode.Fit). Se precisar esticar a imagem sem preservar a proporção, use ScaleMode.Fill ou ScaleMode.Crop (este último corta automaticamente as bordas).
Corte de imagem (crop)
\n\nCrop permite recortar uma área retangular da imagem original. No Kamel, o corte pode ser feito de duas maneiras:
\n\n- \n
- Através do ScaleMode.Crop — corte automático durante o redimensionamento; \n
- Através da especificação manual da região — usando a classe
ImageRegion. \n
Exemplo de corte manual:
\n\nimport media.kamel.image.loadImage\nimport media.kamel.image.cropper.*\n\n@Composable\nfun CroppedImage() {\n val image = loadImage(\n data = "https://example.com/photo.jpg",\n cropper = Cropper(\n region = ImageRegion(\n left = 50,\n top = 50,\n width = 200,\n height = 150\n )\n )\n )\n // Exibição da imagem cortada\n}\n\nAqui, uma área da imagem é recortada começando nas coordenadas (50, 50) e com tamanho de 200x150 pixels. Isso é útil quando você precisa extrair uma parte específica, como um rosto em uma foto.
\n\nCombinação de resize e crop
\n\nFrequentemente é necessário realizar ambas as operações sequencialmente: primeiro cortar, depois redimensionar. O Kamel permite combiná-las através de uma cadeia de chamadas:
\n\n@Composable\nfun CombinedProcessing() {\n val image = loadImage(\n data = "https://example.com/photo.jpg",\n resizer = Resizer(width = 400, height = 300, scaleMode = ScaleMode.Fit),\n cropper = Cropper(region = ImageRegion(100, 100, 600, 450))\n )\n}\n\nOrdem de execução: primeiro aplica