Supposons que vous ayez une image (PNG ou JPG). Cette image a un fond blanc et je dois rendre ce fond transparent.
J'ai essayé avec ces exemples:
convert original.png -background none transparent.png
convert original.png -background white -flatten -alpha off transparent.png
mais sans résultats souhaitables.
Comment puis-je le faire?
IMPORTANT: Utiliser la ligne de commande convert
.
J'utilise ImageMagick 6.6.9-7 sur Ubuntu 12.04.
Ce qui a fonctionné pour moi a été le suivant:
convert test.png -transparent white transparent.png
Cela a changé tout le blanc dans le test.png en transparent.
J'ai eu le même problème. Dans lequel je dois supprimer un fond blanc du format d'image jpg/png en utilisant ImageMagick.
Ce qui a fonctionné pour moi a été:
1) Convertir le format d'image en png: convert input.jpg input.png
2) convert input.png -fuzz 2% -transparent white output.png
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
C'est plutôt un peu plus long que les réponses simples données précédemment, mais cela donne beaucoup de meilleurs résultats: (1) La qualité est supérieure en raison de l'alpha antialiasé, et (2) seulement l'arrière-plan est supprimé par opposition à une couleur unique. ("Arrière-plan" est défini comme ayant à peu près la même couleur que le pixel en haut à 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 l'érosion.
Voici une comparaison de l'approche simple ("-fuzz 2% - transparent transparent") par rapport à ma solution, lorsqu'elle est exécutée sur le logo ImageMagick . J'ai aplati les deux images transparentes sur un fond brun de selle pour faire ressortir les différences (cliquez sur les originaux).
Remarquez comment la barbe du sorcier a disparu dans l'approche simple. Comparez les bords du Wizard pour voir comment l'alpha antialiasé aide la figure à se fondre en douceur dans l'arrière-plan.
Bien sûr, j’admets tout à fait qu’il peut arriver que vous souhaitiez utiliser la solution plus simple. (Par exemple: il est beaucoup plus facile de se rappeler et si vous convertissez au format GIF, vous êtes limité à l'alpha 1 bit de toute façon.)
Comme il est peu probable que vous souhaitiez taper cette commande à plusieurs reprises, je vous recommande de l'envelopper dans un script. Vous pouvez télécharger un script BASH Shell à partir de github qui exécute ma solution suggérée. Il peut être exécuté sur plusieurs fichiers d'un répertoire et inclut des commentaires utiles au cas où vous souhaiteriez peaufiner des choses.
A propos, ImageMagick est 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. En outre, le script bg_removal s'exécute plus lentement et est un peu plus délicat à utiliser (il vous oblige à spécifier deux valeurs fuzz différentes). Voici un exemple de la sortie de bg_removal.
Cela fonctionne pour moi:
convert original.png -fuzz 10% -transparent white transparent.png
où plus le% de fuzz est petit, plus le blanc est proche ou inversement, plus le% est grand, plus la variation du blanc peut devenir transparente
Vous pouvez l'utiliser pour rendre l'arrière-plan transparent
convert test.png -background rgba(0,0,0,0) test1.png
Ce qui précède donne au préfet un arrière-plan transparent
En utilisant ImageMagick, cela ressemble beaucoup au code et au résultat hackerb9, mais c'est une ligne de commande un peu plus simple. Cela suppose que le pixel en haut à gauche est la couleur d'arrière-plan. Je viens juste d’inonder l’arrière-plan de transparence, puis de sélectionner le canal alpha, de le flouter et de supprimer la moitié de la zone floue à l’aide de -level 50x100%. Puis rallumez tous les canaux et aplatissez-le contre la couleur brune. Le niveau -blur 0x1-niveau 50x100% agit pour antialias les limites de la transparence du canal alpha. Vous pouvez ajuster la valeur de flou, la quantité de flou et la valeur de niveau 50% pour modifier le degré d'antialiasing.
convert logo: -fuzz 25% -fill none -draw "Matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg
Si vous souhaitez contrôler le niveau de transparence, vous pouvez utiliser rgba. où a est l'alpha. 0 pour transparent et 1 pour opaque. Assurez-vous que le fichier de sortie final doit avoir une extension .png pour la transparence.
convert
test.png
-channel rgba
-Matte
-fuzz 40%
-fill "rgba(255,255,255,0.5)"
-opaque "rgb(255,255,255)"
semi_transparent.png
Oui. Avait ce même problème aussi. Voici la commande que j'ai exécutée et qui a parfaitement fonctionné: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico