Reemplace la transparencia en imágenes PNG con fondo blanco

294

Tengo algunas imágenes PNG con transparencia, y necesito crear versiones con la capa de imagen compuesta sobre un fondo blanco. He intentado varias cosas con las operaciones de "conversión" de Image Magick, pero no pasa nada o aparece un error. No quiero ir a un formulario JPG intermedio porque no quiero los artefactos. Por supuesto, es fácil hacer esto en Gimp o Photoshop o lo que sea, pero realmente prefiero escribirlo desde la línea de comandos porque hay muchas de estas cosas.

Un ejemplo de un comando Image Magick que no funciona es:

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

Eso da como resultado un error.

¡Gracias!

Puntiagudo
fuente
En mi caso específico, la capa de transparencia en PNG entró en conflicto al pasar por un procesador FO (Apache) para crear un PDF / A. PDF / A no permite la transparencia. El truco que utilicé es recurrir a JPG.
Wivani
3
"Eso da como resultado un error". ¿Cuál es el mensaje de error?
Aaron McDaid el
Ese comando debería funcionar bien. Si no es así, es posible que tenga una instalación defectuosa de Imagemagick o libpng o sus versiones son demasiado antiguas. ¿Cuál es su versión de Imagemagick y libpng?
fmw42

Respuestas:

255

Esto funciona para mi:

convert -flatten img1.png img1-white.png

Referencias de documentación:

remosu
fuente
3
De alguna manera esto no funciona para mí ... Intenté "-transparent-color white", pero obtuve una excepción / advertencia.
William Niu el
1
Resulta que también necesito establecer el fondo en blanco. También tuve que descargar colors.xml, que faltaba.
William Niu el
99
Mira mi respuesta a continuación. Fue agregado 2 años después de este.
Rok Kralj
42
NO intente convertir documentos de varias páginas con -flatten. Aplanará las páginas en una sola página.
Tim S.
8
Si desea hacerlo en todos los archivos de su carpeta, puede hacerlo de esta manera: por mogrify -flatten *.pngsi acaso, no olvide hacer una copia de seguridad. Más información aquí: imagemagick.org/script/mogrify.php
troyane
372
-background white -alpha remove -alpha off

Ejemplo:

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

Siéntase libre de reemplazar whitecon cualquier otro color que desee. La documentación de Imagemagick dice esto sobre la -alpha removeoperación:

Esta operación es simple y rápida, y hace el trabajo sin necesidad de usar memoria adicional u otros efectos secundarios que pueden estar asociados con técnicas alternativas de eliminación de transparencias. Por lo tanto, es la forma preferida de eliminar la transparencia de la imagen.

Rok Kralj
fuente
3
Parece que -background whiteno es necesario (aunque probablemente sea para otros colores).
Skippy le Grand Gourou
55
@SkippyleGrandGourou: es necesario, ya que el color de reserva de transparencia para PNG no siempre es blanco.
Rok Kralj
3
mejor que la respuesta aceptada (que en caso de que más de una capa no haga lo correcto)
axkibe
55
La imagen resultante seguirá teniendo un canal alfa. Estará vacío pero aún estará allí. Para eliminar completamente el canal, agregue -alpha off.
josch
2
No funciona Hice un nuevo PNG con un fondo transparente y un punto rojo en el medio. Siempre produjo un fondo negro, sin importar el color que especifique. convert image.png -background white -alpha off white.pngprodujo una imagen con un fondo negro. convert image.png -background "#00ff33" -alpha off 00ff33.pngprodujo un fondo negro
McNulty
46

Acoplar imagen y aplicar imagen de fondo es sencillo en ImageMagick

Sin embargo, el orden de los comandos es muy importante.

Para aplicar cualquier fondo en una imagen transparente y aplanarlo, primero aplique el fondo que aplanarlo. Lo contrario no funciona.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png
acpmasquerade
fuente
Por alguna razón, esto funcionó bien para mí. No estoy seguro de por qué su intento original no funcionó.
Anthony
23

La única que funcionó para mí fue una mezcla de todas las respuestas:

convert in.png -background white -alpha remove -flatten -alpha off out.png
db0
fuente
44
Genial, eso funcionó. De hecho, necesitaba otro color que el blanco y puedes usarlo en ... -background "#010203" ...lugar de usar blanco.
Alexis Wilke
aquí se explica cómo reemplazar la misma imagen en todas las carpetas de un directoriomogrify -background white -flatten */*.png
Julián,
-alpha removefue lo que hizo por mí
Stefan Dragnev
13

Aquí se explica cómo reemplazar la misma imagen en todas las carpetas en un directorio con blanco en lugar de transparente:

mogrify -background white -flatten */*.png

Julian
fuente
10

Usar -flatten me volvió completamente loco porque -flatten en combinación con mogrify crop y cambiar el tamaño simplemente no funciona. La forma oficial y la única correcta para mí es "eliminar" el canal alfa.

-alpha remove -alpha off (no es necesario con JPG)

Ver documentación: http://www.imagemagick.org/Usage/masking/#remove

Tjarko Rikkerink
fuente
Entonces, ¿cómo se convertiría en el comando? esto no funcionó aquí:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Aquarius Power
Solo quería eliminar alfa. Convertir a JPG lo hizo, agradable y fácil. Gracias por el consejo.
Roger CS Wernersson
Esta es la única solución de lo anterior que funcionó para mí. Ahora la tienda iTunes está contenta con mi imagen.
Bill Cheswick
7

La sección Alpha Remove de la Guía de uso de ImageMagick sugiere usar la -alpha removeopción, por ejemplo:

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

... usando el -backgroundcolor que elijas.

La guía dice:

Esta operación es simple y rápida, y hace el trabajo sin necesidad de usar memoria adicional u otros efectos secundarios que pueden estar asociados con técnicas alternativas de eliminación de transparencias. Por lo tanto, es la forma preferida de eliminar la transparencia de la imagen.

Además agrega la nota:

Tenga en cuenta que mientras se 'elimina' la transparencia, el canal alfa permanecerá activado, pero ahora será completamente opaco. Si ya no necesita el canal alfa, puede usar Alpha Off para deshabilitarlo.

Por lo tanto, si no necesita el canal alfa, puede reducir el tamaño de la imagen de salida agregando la -alpha offopción, por ejemplo:

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

Hay más detalles sobre otras técnicas de uso frecuente para eliminar la transparencia descritas en la sección Eliminar la transparencia de las imágenes .

En esa sección se incluye una advertencia importante sobre el uso de -flattencomo técnica para eliminar la transparencia:

Sin embargo, esto no funcionará con "mogrify" o con una secuencia de múltiples imágenes, básicamente porque el operador "-flatten" está realmente diseñado para fusionar múltiples imágenes en una sola imagen.

Por lo tanto, si está convirtiendo varias imágenes a la vez, por ejemplo, generar miniaturas a partir de un archivo PDF, -flattenno hará lo que desea (aplanará todas las imágenes para todas las páginas en una sola imagen). Por otro lado, el uso de la -alpha removetécnica seguirá produciendo múltiples imágenes, cada una de las cuales tendrá la transparencia eliminada.

Gary
fuente
5

Parece que su comando es correcto, por lo que el problema podría deberse a la falta de soporte para PNG (). Puede verificar convert -list configureo simplemente probar lo siguiente:

sudo yum install libpng libpng-devel
Alastair
fuente
1
Si gracias; esto (de edad) fue tema de un error en "graphicks magick", que es un tenedor / reescritura / lo que sea de "imagen magia'.
puntiagudo
@Pointy Ya veo! Por curiosidad, ¿cuál fue la causa real del problema (solo en una versión)?
Alastair
Bueno, realmente no sé exactamente; Fue solo un error. No soy un mantenedor de Graphicks Magick, así que no tengo idea de su código. Tengo que intentarlo de nuevo en algún momento, supongo.
Puntiagudo
ubuntu no lo tiene? aquí está libpng12-0 pero aún no funciona :(
Aquarius Power
Estoy usando Ubuntu 13.04 con libpng12-0instalado y trabajando. ¿Puedes ver png si ejecutas esto? convert -list configure | grep \png
Alastair
5

Esta no es exactamente la respuesta a su pregunta, pero encontré su pregunta al intentar descubrir cómo eliminar el canal alfa, así que decidí agregar esta respuesta aquí:

Si desea eliminar el canal alfa usando imagemagick, puede usar este comando:

mogrify -alpha off ./*.png
FreeNickname
fuente
3

Bueno, parece que mi decisión de instalar "Magia de gráficos" sobre "Magia de imagen" tiene algunos bordes ásperos: cuando reinstalo la "Magia de imagen" antigua y crujiente, el comando anterior funciona perfectamente bien.

editar , mucho tiempo después: uno de estos días comprobaré si la "magia de gráficos" ha solucionado este problema.

Puntiagudo
fuente
2

Necesitaba cualquiera: ambos -alpha backgroundy -flatten, o -fill.

Hice un nuevo PNG con un fondo transparente y un punto rojo en el medio.

convert image.png -background green -alpha off green.png falló: produjo una imagen con fondo negro

convert image.png -background green -alpha background -flatten green.png produjo una imagen con el fondo verde correcto.

Por supuesto, con otro archivo que renombré image.png, no pudo hacer nada. Para ese archivo, descubrí que el color de los píxeles transparentes era "# d5d5d5", así que rellené ese color con verde:

convert image.png -fill green -opaque "#d5d5d5" green.png reemplazó los píxeles transparentes con el verde correcto.

McNulty
fuente
el comando adecuado con ImageMagick actual sería convert image.png -background green -alpha background -alpha off green.pngo convert image.png -background green -alpha background -alpha remove green.pngo convert image.png -background green -flatten green.png
fmw42
1

Opción de línea sin comando: abra el archivo PNG en Windows Paint y haga clic en Guardar.

hbere
fuente
0

esto crea una imagen simplemente colocando el primero con transparencia encima del segundo

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

originalmente encontré el consejo en esta publicación

Poder de acuario
fuente
0

Para eliminar realmente el canal alfa del archivo, use la opción alpha off :

convert in.png -background white -alpha off out.png
Nick Dowell
fuente
1
En realidad, el enlace que proporcionó dice: "En realidad, no elimina ni destruye el canal alfa adjunto a la imagen, simplemente desactiva cualquier efecto que ese canal tenga en la imagen". Para eliminar realmente el canal alfa, vea mi respuesta.
Rok Kralj
0

Vi esta pregunta y respuestas que realmente me ayudan, pero luego tuve que hacerlo para muchos archivos, por lo que en caso de que tenga varias imágenes (imágenes PNG) en una carpeta y quiera hacerlo para todos:

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

Está desactivado, NO eliminado. ¡La carga de la tienda de aplicaciones iOS falla cuando hay un canal alfa en cualquier ícono!

Aquí se explica cómo hacerlo: mogrify -alpha off * .png

railsfanatic
fuente