132 votes

Définissez un arrière-plan transparent en utilisant ImageMagick et l'invite de commande

Supposons que vous ayez une image (PNG ou JPG). Cette image a un fond blanc et j'ai besoin de 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 satisfaisants.

Comment puis-je le faire ?

IMPORTANT : Utiliser la commande convert en ligne de commande.

149voto

Rijk Points 326

Je suis en train d'utiliser 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.

85voto

Sandeep Pal Points 554

J'avais le même problème : il fallait enlever l'arrière-plan blanc d'une image au format 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

76voto

hackerb9 Points 541

Solution

couleur=$( convert nomdufichier.png -format "%[pixel:p{0,0}]" info:- )
convert nomdufichier.png -alpha off -bordercolor $couleur -border 1 \
    \( +clone -fuzz 30% -fill none -floodfill +0+0 $couleur \
       -alpha extract -geometry 200% -blur 0x0.5 \
       -morphology erode square:1 -geometry 50% \) \
    -compose CopyOpacity -composite -shave 1 nomfichierde sortie.png

Explication

C'est un peu plus long que les réponses simples données précédemment, mais il donne de bien meilleurs résultats: (1) La qualité est supérieure en raison de l'alpha anti-crénelé, et (2) seul l'arrière-plan est supprimé contrairement à une seule couleur. ("l'arrière-plan" est défini comme approximativement la même couleur que le pixel en haut à gauche, en utilisant un floodfill à 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 sous-pixel, alors vous pouvez voir que j'agrandis le canal alpha à 200% avant d'éroder.

Comparaison des résultats

Voici une comparaison de l'approche simple ("-fuzz 2% -transparent white") par rapport à ma solution, lors de l'exécution sur le logo ImageMagick. J'ai aplani les deux images transparentes sur un arrière-plan marron foncé pour rendre les différences apparentes (cliquez pour les originaux).

Le remplacement simple du blanc par du transparent ne fonctionne pas toujours L'alpha crénelé et le floodfill sont bien meilleurs

Remarquez comment la barbe du magicien a disparu dans l'approche simple. Comparez les bords du magicien 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 préférerez peut-être utiliser la solution plus simple. (Par exemple : c'est beaucoup plus facile à retenir et si vous convertissez en GIF, vous êtes de toute façon limité à un alpha de 1 bit.)

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 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 ajuster les choses.

Script bg_removal

Soit dit en passant, ImageMagick inclut en réalité un script appelé "bg_removal" qui utilise le floodfill de manière similaire à ma solution. Cependant, les résultats ne sont pas géniaux car il utilise toujours un alpha d'un 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 flou différentes). Voici un exemple de la sortie de bg_removal.

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

31voto

Ricibald Points 1976

Cela fonctionne pour moi :

convert original.png -fuzz 10% -transparent white transparent.png

où plus le % de flou est petit, plus il se rapproche du blanc pur ou, au contraire, plus le % est élevé, plus il permet des variations du blanc de devenir transparent

14voto

Vous pouvez utiliser ceci pour rendre l'arrière-plan transparent

convert test.png -background rgba(0,0,0,0) test1.png

Le code ci-dessus donne un arrière-plan parfaitement transparent

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X