Trabajo con imágenes en Kotlin: cambio de tamaño y recorte (resize & crop)
En el desarrollo web moderno y la creación de aplicaciones móviles en Kotlin, a menudo surge la necesidad de procesar imágenes mediante programación: reducir el tamaño para optimizar la carga, recortar bordes sobrantes o preparar vistas previas. En este artículo, exploraremos una potente herramienta para trabajar con gráficos: la biblioteca ImageMagick (a través del envoltorio Java JMagick), que es ideal para tareas de resize y crop en Kotlin.
¿Qué son ImageMagick y JMagick?
ImageMagick es un software multiplataforma de código abierto para crear, editar y convertir imágenes rasterizadas. Soporta más de 200 formatos (JPEG, PNG, GIF, WebP, TIFF y otros). Para trabajar con ImageMagick desde Java/Kotlin se utiliza la biblioteca JMagick, que proporciona una interfaz nativa de Java (JNI) a las funciones de ImageMagick.
Ventajas de usar ImageMagick en Kotlin:
- Alto rendimiento (código nativo C/C++)
- Funcionalidad rica: resize, crop, rotate, filtros, conversión de formatos
- Soporte para procesamiento por flujo de imágenes grandes
- Control preciso de la calidad en la compresión
Instalación y configuración
Para trabajar con JMagick, es necesario instalar ImageMagick nativo en su sistema. Luego, agregue la dependencia en build.gradle.kts (para Gradle):
dependencies { implementation("org.im4java:im4java:1.4.0") // Envoltorio alternativo // O use JMagick: implementation("org.jmagick:jmagick:6.6.9")}Nota: JMagick requiere la instalación de ImageMagick versión 6.x (no 7). Para simplificar, en los ejemplos usaremos im4java, un envoltorio más moderno que no requiere JNI.
Cambio de tamaño de imagen (Resize)
La operación resize cambia las dimensiones de la imagen manteniendo la proporción (o no). En im4java, esto se hace a través de la clase ConvertCmd.
Ejemplo: reducir la imagen a un ancho de 300 píxeles, manteniendo la proporción:
import org.im4java.core.ConvertCmdimport org.im4java.core.IMOperation
fun resizeImage(inputPath: String, outputPath: String, targetWidth: Int) { val cmd = ConvertCmd() val op = IMOperation()
op.addImage(inputPath) op.resize(targetWidth, null) // null = altura automática según proporción op.addImage(outputPath)
cmd.run(op)}
fun main() { resizeImage("input.jpg", "output_resized.jpg", 300) println("Imagen reducida a un ancho de 300px")}Parámetros de resize:
resize(width, height)— si un parámetro es null, se mantienen las proporcionesresize(width, height, "^")— relleno mínimo del árearesize(width, height, "!")— cambio forzado sin mantener proporciones
Recorte de imagen (Crop)
Crop extrae un área rectangular de la imagen. Se especifican las coordenadas de la esquina superior izquierda y las dimensiones del área.
Ejemplo: recortar un cuadrado central de tamaño 200x200 píxeles:
import org.im4java.core.ConvertCmdimport org.im4java.core.IMOperation
fun cropImage(inputPath: String, outputPath: String, x: Int, y: Int, width: Int, height: Int) { val cmd = ConvertCmd() val op = IMOperation()
op.addImage(inputPath) op.crop(width, height, x, y) op.addImage(outputPath)
cmd.run(op)}
fun main() { // Recortamos el área: esquina superior izquierda (100,50), tamaño 400x300 cropImage("input.jpg", "output_cropped.jpg", 100, 50, 400, 300) println("Imagen recortada")}Para centrado automático, se pueden calcular las coordenadas:
También en la biblioteca
Internacionalización (i18n) en C++: guía completa con gettext e ICU
Contenedor de Inyección de Dependencias para Kotlin: Koin vs Kodein vs Dagger
Criptografía en Swift (iOS/macOS): cifrado y hash
Procesamiento de imágenes en C++: bibliotecas CImg, OpenCV y Magick++
Trabajo con XML en C# (.NET): Guía completa para principiantes
Recommendations