Solution
color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
\( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
-alpha extract -geometry 200% -blur 0x0.5 \
-morphology erode square:1 -geometry 50% \) \
-compose CopyOpacity -composite -shave 1 outputfilename.png
Explication
C'est plutôt un peu plus long que les réponses simples données précédemment, mais cela donne de bien meilleurs résultats: (1) La qualité est supérieure en raison de l'alpha antialiasé, et (2) seul l'arrière-plan est supprimé par opposition à une seule couleur. ("Arrière-plan" est défini comme approximativement de la même couleur que le pixel supérieur gauche, en utilisant un remplissage à partir des bords de l'image.)
De plus, le canal alpha est également érodé d'un demi-pixel pour éviter les halos. Bien sûr, les opérations morphologiques d'ImageMagick ne fonctionnent pas (encore?) Au niveau des sous-pixels, vous pouvez donc voir que je fais exploser le canal alpha à 200% avant de s'éroder.
Comparaison des résultats
Voici une comparaison de l'approche simple ("-fuzz 2% -transparent white") par rapport à ma solution, lorsqu'elle est exécutée sur le
logo ImageMagick . J'ai aplati les deux images transparentes sur un fond marron pour rendre les différences apparentes (cliquez pour les originaux).
Remarquez comment la barbe du sorcier a disparu dans l'approche simple. Comparez les bords de l'assistant pour voir comment l'alpha anti-crénelé aide la figure à se fondre en douceur dans l'arrière-plan.
Bien sûr, j'admets complètement qu'il y a des moments où vous voudrez peut-être utiliser la solution la plus simple. (Par exemple: c'est beaucoup plus facile à retenir et si vous convertissez en GIF, vous êtes de toute façon limité à l'alpha 1 bit.)
script shell mktrans
Comme il est peu probable que vous souhaitiez taper cette commande à plusieurs reprises, je vous recommande de l'encapsuler dans un script. Vous pouvez télécharger un script shell BASH à partir de github qui exécute ma solution suggérée. Il peut être exécuté sur plusieurs fichiers dans un répertoire et comprend des commentaires utiles au cas où vous souhaiteriez modifier les choses.
script bg_removal
À propos, ImageMagick est en fait livré avec un script appelé
"bg_removal"
qui utilise floodfill de la même manière que ma solution. Cependant, les résultats ne sont pas excellents car il utilise toujours l'alpha 1 bit. De plus, le script bg_removal s'exécute plus lentement et est un peu plus délicat à utiliser (il vous oblige à spécifier deux valeurs de fuzz différentes). Voici un exemple de la sortie de bg_removal.
convert original.png -transparent white new.png
mais en l'essayant, je ne peux pas la faire fonctionner. En passant, êtes-vous sûr que votre arrière-plan est en fait blanc (#FFFFFF), ou est-il juste presque blanc (par exemple #FEFEFE)?