Travailler avec les images en Kotlin : redimensionnement et recadrage (resize & crop)
Dans le développement web moderne et la création d'applications mobiles en Kotlin, il est souvent nécessaire de traiter des images par programmation : réduire la taille pour optimiser le chargement, recadrer les bords superflus ou préparer des aperçus. Dans cet article, nous allons examiner un outil puissant pour le travail graphique — la bibliothèque ImageMagick (via le wrapper Java JMagick), qui est parfaitement adaptée aux tâches de redimensionnement et de recadrage en Kotlin.
Qu'est-ce qu'ImageMagick et JMagick ?
ImageMagick est un logiciel multiplateforme open source pour la création, l'édition et la conversion d'images matricielles. Il prend en charge plus de 200 formats (JPEG, PNG, GIF, WebP, TIFF et autres). Pour travailler avec ImageMagick depuis Java/Kotlin, on utilise la bibliothèque JMagick, qui fournit une interface native Java (JNI) aux fonctions d'ImageMagick.
Avantages de l'utilisation d'ImageMagick en Kotlin :
- Haute performance (code natif C/C++)
- Fonctionnalités riches : redimensionnement, recadrage, rotation, filtres, conversion de formats
- Prise en charge du traitement par flux de grandes images
- Contrôle précis de la qualité lors de la compression
Installation et configuration
Pour travailler avec JMagick, vous devez installer ImageMagick natif sur votre système. Ensuite, ajoutez la dépendance dans build.gradle.kts (pour Gradle) :
dependencies { implementation("org.im4java:im4java:1.4.0") // Wrapper alternatif // Ou utilisez JMagick : implementation("org.jmagick:jmagick:6.6.9")}Remarque : JMagick nécessite l'installation d'ImageMagick version 6.x (pas 7). Pour simplifier, dans les exemples, nous utiliserons im4java — un wrapper plus moderne ne nécessitant pas JNI.
Redimensionnement d'image (Resize)
L'opération resize modifie les dimensions d'une image en conservant les proportions (ou non). Dans im4java, cela se fait via la classe ConvertCmd.
Exemple : réduire une image à une largeur de 300 pixels en conservant les proportions :
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 = hauteur automatique selon les proportions op.addImage(outputPath)
cmd.run(op)}
fun main() { resizeImage("input.jpg", "output_resized.jpg", 300) println("Image réduite à une largeur de 300px")}Paramètres de resize :
resize(width, height)— si un paramètre est null, les proportions sont conservéesresize(width, height, "^")— remplissage minimal de la zoneresize(width, height, "!")— redimensionnement forcé sans conservation des proportions
Recadrage d'image (Crop)
Crop découpe une zone rectangulaire dans une image. On spécifie les coordonnées du coin supérieur gauche et les dimensions de la zone.
Exemple : découper un carré central de 200x200 pixels :
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() { // Découper la zone : coin supérieur gauche (100,50), taille 400x300 cropImage("input.jpg", "output_cropped.jpg", 100, 50, 400, 300) println("Image recadrée")}Pour un centrage automatique, on peut calculer les coordonnées :
Aussi dans la bibliothèque
Recommendations