3 méthodes Imagemagick pour remplir les zones vides d'une image recadrée
- EN
- FR
Je décris dans cet article 4 méthodes permettant de combler les zones vides d’une image lorsqu’on l’agrandit, une technique basique, et 3 s’appuyant sur l’image initiale, pour un remplissage plus naturel. A la fin de l’article, je donne un script shell permettant de générer les 4 versions pour une image donnée.
Edit du 22/04/2023 : Ajout du remplissage avec la couleur de fond initiale.
Méthode 1 : Remplir des zones vides par un fond uni
Simple : Couleur de fond fixée (blanc)
convert IMAGESOURCE -trim -fuzz 5% +repage -auto-orient -resize XxY -background white -gravity center -extent XxY IMAGECIBLE
NB : Remplacer XxY par les dimensions souhaitées et “white” par la couleur souhaitée.
Exemple :
Avancée : Couleur de fond prise dans le premier pixel en haut à gauche de l’image originale
convert IMAGESOURCE -gravity northwest -crop 1x1+0+0 -format "%[pixel:u]" info:- | xargs -I {} convert IMAGESOURCE -resize XxY -background {} -gravity center -extent XxY IMAGECIBLE
Exemple :
Méthode 2 : Remplir les zones vides en surimposant l’image sur sa version floue et déformée
Inspiration :
Fred/fmw42 dans cette page de forum : ImageMagick - Keep Aspect Ratio on Resize and Fill with Blur Background.
convert IMAGESOURCE \( -clone 0 -blur 0x9 -resize XxY\! \) \( -clone 0 -resize XxY \) -delete 0 -gravity center -compose over -composite IMAGECIBLE
NB : Remplacer XxY par les dimensions souhaitées.
Exemple :
Méthode 3 : Remplissage des zones vides par extrapolation
Inspiration :
Fred/fmw42 dans cette page de forum : ImageMagick - turn image with borders into full bleed image.
Le code est un peu long, je ne le met pas ici, il se trouve dans le script shell plus bas.
Le résultat est assez bluffant sur les photos, en particulier si les dimensions ne sont pas trop éloignées de l’original : Il faut parfois regarder de près les zones extrapolées pour réaliser qu’elles sont artificielles (ici en 300x300).
En revanche les grands aplats de blanc ne lui conviennent pas et ressortent en rouge.
Exemple :
Script shell
Ce script shell prend tous les fichiers du sous-répertoire “a_traiter/” et produit les résultats selon les 3 modes dans le répertoire “res/” .
- Mode 11 : Aplat de blanc ;
- Mode 12 : Aplat de la couleur de fond ;
- Mode 2 : Extension ;
- Mode 4 : Voronoi.
Mise en place :
mkdir gen_thumbs
cd gen_thumbs
mkdir a_traiter res
touch gen_thumbs.sh
chmod +x gen_thumbs.sh
Editer le fichier “gen_thumbs.sh” et y mettre :
#!/bin/bash
for fic in a_traiter/*
do
echo ${fic}
ficsource=$(basename "${fic}")
xcible=300
ycible=200
size=${xcible}x${ycible}
convert "${fic}" -resize ${size} res/tmp.png
xoff=`convert res/tmp.png -format "%w" info:`
yoff=`convert res/tmp.png -format "%h" info:`
yoff=$(((${ycible}-${yoff})/2))
xoff=$(((${xcible}-${xoff})/2))
vcoords="${size}-${xoff}-${yoff}"
echo ${vcoords}
# Mode 11 - fond blanc
convert "${fic}" -trim -fuzz 5% +repage -auto-orient -resize ${xcible}x${ycible} -background white -gravity center -extent ${xcible}x${ycible} res/"${ficsource}".mode11.jpg
# Mode 12 - fond repris de l'original
convert "${fic}" -gravity northwest -crop 1x1+0+0 -format "%[pixel:u]" info:- | xargs -I {} convert "${fic}" -trim -fuzz 5% +repage -auto-orient -resize ${xcible}x${ycible} -background {} -gravity center -extent ${xcible}x${ycible} res/"${ficsource}".mode12.jpg
# Mode 2 - superposition
convert "${fic}" \( -clone 0 -blur 0x9 -resize ${xcible}x${ycible}\! \) \( -clone 0 -resize ${xcible}x${ycible} \) -delete 0 -gravity center -compose over -composite res/"${ficsource}".mode2.jpg
# Mode 3 - superposition
convert res/tmp.png -transparent white +repage \( -clone 0 -alpha off -sparse-color Voronoi \
"9,9 rgb(255,8,8) 969,9 rgb(255,255,8) 969,669 rgb(255,255,248) 9,669 rgb(255,248,248)" \) \
+swap -compose over -composite \
-define distort:viewport=${size}-${xoff}-${yoff} +distort SRT 0 +repage res/"${ficsource}".mode3.jpg
rm -f res/tmp.png
done
Il n’y a plus qu’à mettre une image dans le répertoire “a_traiter/” et lancer le script :
cd gen_thumbs/
./gen_thumbs.sh
Le résultat sera produit dans “res/”.
Note : Pour modifier les dimensions cible, il suffit de changer les valeurs de xcible=xxx et ycible=yyy.