Définir un arrière-plan transparent à l’aide d’ImageMagick et de l’invite de ligne de commande

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ésultat souhaitable.

Comment puis-je le faire?

IMPORTANT: Utilisation de la ligne de commande de convert .

J’utilise ImageMagick 6.6.9-7 sur Ubuntu 12.04.
Ce qui a fonctionné pour moi était 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 le fond blanc du format d’image jpg / png en utilisant ImageMagick.

Ce qui a fonctionné pour moi était:

1) Convertir le format de l’image en png: convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png

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 du vrai ou inversement, plus le% est grand, plus la variation par rapport au blanc peut devenir transparente

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 grâce à l’alpha anti-aliasé et (2) seul l’arrière-plan est supprimé par opposition à une seule couleur. (“Arrière-plan” est défini sur la même couleur que le pixel en haut à gauche, en utilisant un remplissage 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 du sous-pixel, vous pouvez donc voir que je fais sauter le canal alpha à 200% avant de l’é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 en selle pour faire apparaître les différences (cliquez pour les originaux).

Le simple remplacement du blanc comme transparent ne fonctionne pas toujours L'alphachannel et le remplissage anti-alias ont l'air bien mieux

Remarquez comment la barbe du sorcier a disparu dans l’approche simple. Comparez les bords de l’assistant pour voir comment l’alpha antialiasé aide la figure à se fondre en douceur dans l’arrière-plan.

Bien entendu, j’admets complètement qu’il y a des moments où vous pouvez souhaiter utiliser la solution la plus simple. (Par exemple: il est beaucoup plus facile de se souvenir et si vous convertissez en GIF, vous êtes limité à l’alpha 1 bit de toute façon.)

script shell mktrans

Comme il est peu probable que vous souhaitiez taper cette commande à plusieurs resockets, je vous recommande de l’enrouler 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 inclut des commentaires utiles au cas où vous voudriez modifier des choses.

script bg_removal

Au fait, 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 bons car il utilise toujours l’alpha 1 bit. En outre, le script bg_removal s’exécute plus lentement et est un peu plus compliqué à utiliser (vous devez spécifier deux valeurs de fuzz différentes). Voici un exemple de sortie de bg_removal.

Le script bg_removal: a barbe, mais manque d'antialiasing

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 le fond transparent du préfet

Si vous voulez 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 l’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 

En utilisant ImageMagick, cela ressemble beaucoup au code et au résultat de hackerb9, mais c’est une ligne de commande un peu plus simple. Il suppose que le pixel en haut à gauche est la couleur d’arrière-plan. Je viens de remplir le fond avec de la transparence, puis sélectionnez le canal alpha et flou et supprimez la moitié de la zone floue en utilisant -level 50×100%. Revenez ensuite sur tous les canaux et aplatissez-le contre la couleur brune. Le -blur 0x1 -level 50×100% agit comme antialias les limites de la transparence du canal alpha. Vous pouvez ajuster la valeur de fuzz, 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 

entrer la description de l'image ici

Oui. Avait ce même problème aussi. Voici la commande que j’ai exécutée et cela a parfaitement fonctionné: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico