Procesamiento de imágenes en Kotlin: resize y crop con la biblioteca ImageMagick

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 proporciones
  • resize(width, height, "^") — relleno mínimo del área
  • resize(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:



                
    
    

Recommendations