web-dev-qa-db-fra.com

Définir un arrière-plan transparent à l'aide d'ImageMagick et d'une 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ésultats souhaitables.

Comment puis-je le faire?

IMPORTANT: Utiliser la ligne de commande convert.

107
Israel

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.

129
Rijk

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

71
Sandeep Pal

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 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.

Comparaison des résultats

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).

The simple replacement of white as transparent doesn't always workAntialiased alphachannel and floodfill looks much better

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.)

script shell mktrans

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.

script bg_removal

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.

The bg_removal script: has beard, but lacks antialiasing

32
hackerb9

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

25
Ricibald

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

12
Sanat Kumar Panda

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

enter image description here

5
fmw42

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
4
Gokul N K

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

1
stacigh