Trabalho com imagens em Kotlin: visão geral das bibliotecas e exemplos práticos
Kotlin é uma linguagem multiplataforma moderna, amplamente utilizada para desenvolvimento em JVM (Desktop), Android, bem como em projetos backend e multiplataforma (KMP). O trabalho com imagens é uma das tarefas comuns, e o ecossistema Kotlin oferece várias abordagens: desde o uso de bibliotecas Java padrão até soluções especializadas para Android e Kotlin Multiplatform. Neste artigo, abordaremos as principais bibliotecas e ferramentas, mostraremos exemplos de código e daremos recomendações práticas.
1. Ferramentas integradas: AWT (Java Desktop / JVM)
Para aplicações desktop em JVM (por exemplo, JavaFX ou Swing), o mais conveniente é usar os pacotes padrão java.awt e javax.imageio. Essas bibliotecas estão disponíveis "de fábrica" e permitem carregar, redimensionar, converter formatos e desenhar em imagens.
Exemplo: carregar, redimensionar e salvar
import java.awt.image.BufferedImageimport java.io.Fileimport javax.imageio.ImageIO
fun resizeImage(inputPath: String, outputPath: String, newWidth: Int, newHeight: Int) { val original: BufferedImage = ImageIO.read(File(inputPath)) val resized = BufferedImage(newWidth, newHeight, original.type) val g = resized.createGraphics() g.drawImage(original, 0, 0, newWidth, newHeight, null) g.dispose() ImageIO.write(resized, "jpg", File(outputPath)) println("Imagem salva: $outputPath")}
fun main() { resizeImage("input.jpg", "output.jpg", 800, 600)}Para rotação, sobreposição de marcas d'água ou corte, podem ser usados métodos Graphics2D e transformações afins.
2. Android: Bitmap e BitmapFactory
No desenvolvimento Android com Kotlin, a base para trabalhar com imagens é a classe android.graphics.Bitmap e os utilitários BitmapFactory. Eles permitem carregar imagens de recursos, arquivos ou rede, além de realizar processamento básico.
Exemplo: carregar de recursos e redimensionar (Android)
import android.graphics.Bitmapimport android.graphics.BitmapFactoryimport android.graphics.Matriximport java.io.ByteArrayOutputStream
fun scaleBitmap(bitmap: Bitmap, maxSize: Int): Bitmap { val width = bitmap.width val height = bitmap.height val scale = if (width > height) maxSize.toFloat() / width else maxSize.toFloat() / height val matrix = Matrix() matrix.postScale(scale, scale) return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true)}
fun bitmapToByteArray(bitmap: Bitmap, quality: Int = 90): ByteArray { val stream = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream) return stream.toByteArray()}Para processamento mais avançado (filtros, efeitos), pode-se usar android.renderscript (obsoleto na API 31) ou a biblioteca OpenCV Android.
3. Kotlin Multiplatform (KMP): biblioteca KVision ou soluções próprias
Em projetos multiplataforma, não há um padrão único para trabalhar com imagens. Frequentemente são usados:
- KVision — framework para aplicações web em Kotlin/JS, com suporte integrado para Canvas e ImageData.
- Okio + ImageIO (JVM) / Bitmap (Android) — para KMP, frequentemente escrevem wrappers
expect/actual, onde cada plataforma usa sua própria implementação. - Skiko — biblioteca da JetBrains para trabalhar com gráficos (Skia), disponível em JVM, JS e Native. Permite carregar, desenhar e exportar imagens.
Exemplo expect/actual para KMP:
// commonMainexpect fun loadImageBytes(path: String): ByteArray
// androidMainactual fun load Também na biblioteca
Processamento de Markdown em Swift para iOS e macOS: bibliotecas e exemplos
Trabalho com imagens em PHP: visão geral de bibliotecas e ferramentas
Bibliotecas WebSocket Swift: Starscream e URLSessionWebSocketTask