Trabajo con imágenes en Kotlin: resumen de bibliotecas y ejemplos prácticos
Kotlin es un lenguaje moderno multiplataforma que se utiliza activamente para el desarrollo en JVM (Desktop), Android, así como en proyectos backend y multiplataforma (KMP). El trabajo con imágenes es una de las tareas comunes, y en el ecosistema de Kotlin existen varios enfoques: desde el uso de bibliotecas estándar de Java hasta soluciones especializadas para Android y Kotlin Multiplatform. En este artículo analizaremos las principales bibliotecas y herramientas, mostraremos ejemplos de código y daremos recomendaciones prácticas.
1. Herramientas integradas: AWT (Java Desktop / JVM)
Para aplicaciones de escritorio en JVM (por ejemplo, en JavaFX o Swing), lo más conveniente es usar el paquete estándar java.awt y javax.imageio. Estas bibliotecas están disponibles "de serie" y permiten cargar, cambiar el tamaño, convertir formatos y dibujar en imágenes.
Ejemplo: carga, cambio de tamaño y guardado
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("Imagen guardada: $outputPath")}
fun main() { resizeImage("input.jpg", "output.jpg", 800, 600)}Para rotar, superponer marcas de agua o recortar, se pueden usar los métodos de Graphics2D y las transformaciones afines.
2. Android: Bitmap y BitmapFactory
En el desarrollo de Android con Kotlin, la base para trabajar con imágenes es la clase android.graphics.Bitmap y las utilidades BitmapFactory. Permiten cargar imágenes desde recursos, archivos o la red, así como realizar procesamiento básico.
Ejemplo: carga desde recursos y cambio de tamaño (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 procesamiento más complejo (filtros, efectos), se puede usar android.renderscript (obsoleto en API 31) o la biblioteca OpenCV Android.
3. Kotlin Multiplatform (KMP): biblioteca KVision o soluciones propias
En proyectos multiplataforma no hay un estándar único para trabajar con imágenes. A menudo se utilizan:
- KVision — framework para aplicaciones web en Kotlin/JS, con soporte integrado para trabajar con Canvas e ImageData.
- Okio + ImageIO (JVM) / Bitmap (Android) — para KMP a menudo se escriben envoltorios
expect/actual, donde en cada plataforma se usa su propia implementación. - Skiko — biblioteca de JetBrains para trabajar con gráficos (Skia), disponible en JVM, JS y Native. Permite cargar, dibujar y exportar imágenes.
Ejemplo de expect/actual para KMP:
// commonMainexpect fun loadImageBytes(path: String): ByteArray
// androidMainactual fun load También en la biblioteca
Creación de aplicaciones CLI en TypeScript: visión general de frameworks y herramientas
Envío de correo electrónico en JavaScript (Node.js) — bibliotecas y ejemplos de código
Envío de SMS en C++: API con biblioteca LibCurl y solicitudes REST
Retrofit para Java: guía completa con ejemplos prácticos