Remplacer la transparence des images PNG par un fond blanc

294

J'ai des images PNG transparentes et je dois créer des versions avec le calque d'image composé sur un fond blanc. J'ai essayé différentes choses avec les opérations de "conversion" d'Image Magick, mais soit rien ne se produit, soit je reçois une erreur. Je ne veux pas passer à un formulaire JPG intermédiaire parce que je ne veux pas des artefacts. Bien sûr, il est facile de le faire dans Gimp ou Photoshop ou autre, mais je préfère vraiment l'écrire à partir de la ligne de commande car il y a beaucoup de ces choses.

Un exemple de commande Image Magick non fonctionnelle est:

convert img1.png -background white -flatten img1-white.png

Cela entraîne une erreur.

Merci!

Pointu
la source
Dans mon cas spécifique, la couche de transparence en PNG était en conflit lors du passage par un processeur FO (Apache) pour créer un PDF / A. PDF / A ne permet pas la transparence. Le hack que j'ai utilisé est de se tourner vers JPG à la place.
Wivani
3
"Cela entraîne une erreur." Quel est le message d'erreur?
Aaron McDaid
Cette commande devrait fonctionner correctement. Si ce n'est pas le cas, vous pouvez avoir une installation boguée d'Imagemagick ou de libpng ou vos versions de l'une ou l'autre sont trop anciennes. Quelle est votre version d'Imagemagick et de libpng?
fmw42

Réponses:

255

Cela fonctionne pour moi:

convert -flatten img1.png img1-white.png

Références documentaires:

remosu
la source
3
D'une certaine manière, cela ne fonctionne pas pour moi ... J'ai essayé "-transparent-color white", mais j'ai obtenu une exception / avertissement.
William Niu
1
Il s'avère que j'ai également besoin de définir le -background sur blanc. J'ai également dû télécharger le colors.xml, qui manquait.
William Niu
9
Découvrez ma réponse ci-dessous. Il a été ajouté 2 ans après celui-ci.
Rok Kralj
42
N'essayez PAS de convertir des documents de plusieurs pages avec -flatten. Il aplatira les pages en une seule page.
Tim S.
8
Si vous voulez le faire sur tous les fichiers de votre dossier, vous pouvez le faire de cette façon: mogrify -flatten *.pngjuste au cas où, n'oubliez pas de faire une sauvegarde. Plus d'infos ici: imagemagick.org/script/mogrify.php
troyane
372
-background white -alpha remove -alpha off

Exemple:

convert image.png -background white -alpha remove -alpha off white.png

N'hésitez pas à remplacer whitepar n'importe quelle autre couleur que vous souhaitez. La documentation d'Imagemagick dit ceci sur l' -alpha removeopération:

Cette opération est simple et rapide, et fait le travail sans avoir besoin de mémoire supplémentaire ou d'autres effets secondaires qui peuvent être associés à des techniques alternatives de suppression de la transparence. C'est donc le moyen privilégié de supprimer la transparence de l'image.

Rok Kralj
la source
3
Semble que ce -background whiten'est pas nécessaire (c'est probablement pour d'autres couleurs cependant).
Skippy le Grand Gourou du
5
@SkippyleGrandGourou: C'est nécessaire, car la couleur de remplacement de transparence pour PNG n'est pas toujours blanche.
Rok Kralj
3
mieux que la réponse acceptée (qui dans le cas de plusieurs couches ne fait pas la bonne chose)
axkibe
5
L'image résultante aura toujours un canal alpha. Il sera vide mais il sera toujours là. Pour supprimer complètement la chaîne, ajoutez -alpha off.
josch
2
Ça ne marche pas. J'ai fait un nouveau PNG avec un fond transparent et un point rouge au milieu. Produit toujours un fond noir, quelle que soit la couleur que j'ai spécifiée. convert image.png -background white -alpha off white.pngproduit une image avec un fond noir. convert image.png -background "#00ff33" -alpha off 00ff33.pngproduit un fond noir
McNulty
46

L'aplatissement de l'image et l'application de l'image d'arrière-plan sont simples dans ImageMagick

Cependant, l'ordre des commandes est très important

Pour appliquer un arrière-plan sur une image transparente et l'aplatir, appliquez d'abord l'arrière-plan avant de l'aplatir. L'inverse ne fonctionne pas.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png
acpmasquerade
la source
Pour une raison quelconque, cela a bien fonctionné pour moi. Je ne sais pas pourquoi votre tentative initiale n'a pas fonctionné.
Anthony
23

La seule qui a fonctionné pour moi était un mélange de toutes les réponses:

convert in.png -background white -alpha remove -flatten -alpha off out.png
db0
la source
4
Cool, ça a marché. En fait, j'avais besoin d'une autre couleur que le blanc et vous pouvez utiliser ... -background "#010203" ...au lieu d'utiliser du blanc.
Alexis Wilke
voici comment remplacer la même image dans tous les dossiers d'un répertoiremogrify -background white -flatten */*.png
Julian
-alpha removeétait ce qui a fait pour moi
Stefan Dragnev
13

voici comment remplacer la même image dans tous les dossiers d'un répertoire avec du blanc au lieu de transparent:

mogrify -background white -flatten */*.png

julien
la source
10

L'utilisation de -flatten m'a rendu complètement fou parce que -flatten en combinaison avec mogrify crop et redimensionnement ne fonctionne tout simplement pas. Le moyen officiel et pour moi le seul correct est de "supprimer" le canal alpha.

-alpha supprimer -alpha off (pas nécessaire avec JPG)

Voir la documentation: http://www.imagemagick.org/Usage/masking/#remove

Tjarko Rikkerink
la source
alors comment deviendrait la commande? cela n'a pas fonctionné ici:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Aquarius Power
Je voulais seulement supprimer alpha. Convertir en JPG l'a fait, agréable et facile. Merci pour le conseil.
Roger CS Wernersson
C'est la seule solution de ce qui précède qui a fonctionné pour moi. Maintenant, l'iTunes Store est satisfait de mon image.
Bill Cheswick
7

La section Alpha Remove du Guide d'utilisation d'ImageMagick suggère d'utiliser l' -alpha removeoption, par exemple:

convert in.png  -background white  -alpha remove  out.png

...en utilisant le -background couleur de votre choix.

Le guide déclare:

Cette opération est simple et rapide, et fait le travail sans avoir besoin de mémoire supplémentaire ou d'autres effets secondaires qui peuvent être associés à des techniques alternatives de suppression de la transparence. C'est donc le moyen privilégié de supprimer la transparence de l'image.

Il ajoute en outre la note:

Notez que pendant que la transparence est «supprimée», le canal alpha restera activé, mais sera désormais entièrement opaque. Si vous n'avez plus besoin du canal alpha, vous pouvez alors utiliser Alpha Off pour le désactiver.

Ainsi, si vous n'avez pas besoin du canal alpha, vous pouvez réduire la taille de votre image de sortie en ajoutant l' -alpha offoption, par exemple:

convert in.png  -background white  -alpha remove  -alpha off  out.png

Il existe plus de détails sur les autres techniques fréquemment utilisées pour supprimer la transparence décrites dans la section Suppression de la transparence des images .

Cette section mentionne une mise en garde importante à l'utilisation de -flattencomme technique pour éliminer la transparence:

Cependant, cela ne fonctionnera pas avec "mogrify" ou avec une séquence de plusieurs images, essentiellement parce que l'opérateur "-flatten" est vraiment conçu pour fusionner plusieurs images en une seule image.

Donc, si vous convertissez plusieurs images à la fois, par exemple en générant des miniatures à partir d'un fichier PDF, vous -flattenne ferez pas ce que vous voulez (cela aplatira toutes les images de toutes les pages en une seule image). D'un autre côté, l'utilisation de la -alpha removetechnique produira toujours plusieurs images, chacune ayant la transparence supprimée.

Gary
la source
5

Il semble que votre commande soit correcte, donc le problème peut être dû à un support manquant pour PNG (). Vous pouvez vérifier avec convert -list configureou simplement essayer ce qui suit:

sudo yum install libpng libpng-devel
Alastair
la source
1
Oui merci; ce (ancien) problème était un bogue dans "graphicks magick", qui est un fork / réécriture / quoi que ce soit de "image magick '.
Pointy
@Pointy je vois! Par curiosité, quelle était la cause réelle du problème (qui n'était que dans une seule version)?
Alastair
Eh bien, je ne sais vraiment pas exactement; c'était juste un bug. Je ne suis pas un mainteneur de Graphicks Magick donc je n'ai aucune idée de leur code. Je dois réessayer à un moment donné, je suppose.
Pointy
ubuntu ne l'a pas? voici libpng12-0 mais ne fonctionne toujours pas :(
Aquarius Power
J'utilise Ubuntu 13.04 avec libpng12-0installé et fonctionne. Pouvez-vous voir png si vous exécutez cela? convert -list configure | grep \png
Alastair
5

Ce n'est pas exactement la réponse à votre question, mais j'ai trouvé votre question en essayant de comprendre comment supprimer le canal alpha, j'ai donc décidé d'ajouter cette réponse ici:

Si vous souhaitez supprimer le canal alpha en utilisant imagemagick, vous pouvez utiliser cette commande:

mogrify -alpha off ./*.png
FreeNickname
la source
3

Welp, il semble que ma décision d'installer "Graphics Magick" sur "Image Magick" a des bords rugueux - lorsque je réinstalle une ancienne "Image Magick" authentique et cruelle, la commande ci-dessus fonctionne parfaitement bien.

modifier , longtemps plus tard - Un de ces jours, je vérifierai si "graphics magick" a résolu ce problème.

Pointu
la source
2

J'avais besoin de: à la fois -alpha backgroundet -flatten, ou -fill.

J'ai fait un nouveau PNG avec un fond transparent et un point rouge au milieu.

convert image.png -background green -alpha off green.png a échoué: il a produit une image avec un fond noir

convert image.png -background green -alpha background -flatten green.png produit une image avec le bon fond vert.

Bien sûr, avec un autre fichier que j'ai renommé image.png, il n'a rien fait. Pour ce fichier, j'ai trouvé que la couleur des pixels transparents était "# d5d5d5", j'ai donc rempli cette couleur de vert:

convert image.png -fill green -opaque "#d5d5d5" green.png remplacé les pixels transparents par le vert correct.

McNulty
la source
la commande appropriée avec ImageMagick actuelle serait convert image.png -background green -alpha background -alpha off green.pngou convert image.png -background green -alpha background -alpha remove green.pngou convert image.png -background green -flatten green.png
fmw42
1

Option sans ligne de commande: ouvrez le fichier PNG dans Windows Paint et cliquez sur Enregistrer.

hbere
la source
0

cela crée une image en plaçant simplement le 1er avec transparence au-dessus du 2e

composite -gravity center ImgWithTransp.png BackgroundSameSizeOfImg.png ResultImg.png

à l'origine trouvé l'astuce sur ce post

Puissance du Verseau
la source
0

Pour supprimer réellement le canal alpha du fichier, utilisez l' option alpha off :

convert in.png -background white -alpha off out.png
Nick Dowell
la source
1
En fait, le lien que vous avez fourni dit: "Il ne supprime pas ni ne détruit le canal alpha attaché à l'image, il désactive simplement tout effet que ce canal a sur l'image." Pour vraiment supprimer le canal alpha, voir ma réponse.
Rok Kralj
0

J'ai vu cette question et les réponses qui m'aident vraiment, mais il fallait que je le fasse pour beaucoup de fichiers, donc au cas où vous avez plusieurs images (images PNG) dans un dossier et que vous vouliez le faire pour tous:

find ./ -name "*.png" -exec convert {} -flatten {} \;
talsibony
la source
-1

C'est -alpha désactivé, PAS -alpha supprimer! Le téléchargement de l'App Store iOS échoue lorsqu'il y a un canal alpha dans n'importe quelle icône !!

Voici comment procéder: mogrify -alpha off * .png

railsfanatic
la source