Sostituisci la trasparenza nelle immagini PNG con sfondo bianco


294

Ho alcune immagini PNG con trasparenza e ho bisogno di creare versioni con il livello immagine composto su uno sfondo bianco. Ho provato varie cose con le operazioni di "conversione" di Image Magick, ma o non succede nulla o ricevo un errore. Non voglio andare a un modulo JPG intermedio perché non voglio i manufatti. Ovviamente è facile farlo in Gimp o Photoshop o altro, ma preferirei davvero scriverlo dalla riga di comando perché ci sono molte di queste cose.

Un esempio di comando Image Magick non funzionante è:

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

Ciò provoca un errore.

Grazie!


Nel mio caso specifico il livello di trasparenza in PNG è in conflitto quando si passa attraverso un processore FO (Apache) per creare un PDF / A. PDF / A non consente la trasparenza. L'hack che ho usato è invece passare a JPG.
Wivani,

3
"Ciò provoca un errore." Qual è il messaggio di errore?
Aaron McDaid,

Tale comando dovrebbe funzionare correttamente. In caso contrario, potresti avere un'installazione errata di Imagemagick o libpng o le tue versioni di entrambi sono troppo vecchie. Qual è la tua versione di Imagemagick e libpng?
fmw42,

Risposte:


255

Questo funziona per me:

convert -flatten img1.png img1-white.png

Riferimenti alla documentazione:


3
In qualche modo questo non funziona per me ... Ho provato "bianco trasparente-colore", ma ho ricevuto un'eccezione / avviso.
William Niu,

1
Si scopre che devo impostare anche lo sfondo per il bianco. Ho anche dovuto scaricare il colors.xml, che mancava.
William Niu,

9
Dai un'occhiata alla mia risposta qui sotto. È stato aggiunto 2 anni dopo questo.
Rok Kralj,

42
NON tentare di convertire documenti con più pagine con -flatten. Appiattirà le pagine in una pagina.
Tim S.,

8
Se vuoi farlo su tutti i file dalla tua cartella puoi farlo in questo modo: mogrify -flatten *.pngper ogni evenienza, non dimenticare di fare il backup. Maggiori informazioni qui: imagemagick.org/script/mogrify.php
troyane il

372
-background white -alpha remove -alpha off

Esempio:

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

Sentiti libero di sostituire whitecon qualsiasi altro colore che desideri. La documentazione di Imagemagick dice questo -alpha removesull'operazione:

Questa operazione è semplice e veloce e fa il lavoro senza l'uso di memoria aggiuntiva o altri effetti collaterali che possono essere associati a tecniche di rimozione della trasparenza alternative. È quindi il modo preferito di rimuovere la trasparenza dell'immagine.


3
Sembra che -background whitenon sia necessario (probabilmente per altri colori).
Skippy le Grand Gourou,

5
@SkippyleGrandGourou: è necessario, poiché il colore di fallback della trasparenza per PNG non è sempre bianco.
Rok Kralj,

3
meglio della risposta accettata (che in caso di più di un livello non fa la cosa giusta)
axkibe,

5
L'immagine risultante avrà ancora un canale alfa. Sarà vuoto ma sarà ancora lì. Per rimuovere completamente il canale aggiungi -alpha off.
Jose

2
Non funziona Ho realizzato un nuovo PNG con uno sfondo trasparente e un punto rosso al centro. Produceva sempre uno sfondo nero, indipendentemente dal colore specificato. convert image.png -background white -alpha off white.pngprodotto un'immagine con uno sfondo nero. convert image.png -background "#00ff33" -alpha off 00ff33.pngha prodotto uno sfondo nero
McNulty il

46

Appiattire l'immagine e applicare l'immagine di sfondo è semplice in ImageMagick

Tuttavia, l'ordine dei comandi è molto importante

Per applicare uno sfondo a un'immagine trasparente e appiattirlo, applicare prima lo sfondo anziché appiattirlo. Il contrario non funziona.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png

Per qualsiasi motivo, questo ha funzionato bene per me. Non sono sicuro del motivo per cui il tuo tentativo originale non ha funzionato.
Anthony,

23

L'unico che ha funzionato per me è stato un mix di tutte le risposte:

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

4
Bene, ha funzionato. In realtà avevo bisogno di un altro colore rispetto al bianco e puoi usare ... -background "#010203" ...invece di usare il bianco.
Alexis Wilke,

ecco come sostituire la stessa immagine in tutte le cartelle in una directorymogrify -background white -flatten */*.png
Julian,

-alpha removeè stato quello che ha fatto per me
Stefan Dragnev il

13

ecco come sostituire la stessa immagine in tutte le cartelle in una directory con bianco anziché trasparente:

mogrify -background white -flatten */*.png


10

L'uso di -flatten mi ha reso completamente pazzo perché -flatten in combinazione con il ritaglio mogrify e il ridimensionamento semplicemente non funziona. Il modo ufficiale e per me solo corretto è "rimuovere" il canale alfa.

-alpha remove -alpha off (non necessario con JPG)

Vedi documentazione: http://www.imagemagick.org/Usage/masking/#remove


quindi come diventerebbe il comando? questo non ha funzionato qui:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Aquarius Power il

Volevo solo rimuovere l'alfa. Convertito in JPG, è stato facile e facile. Grazie per il consiglio.
Roger CS Wernersson,

Questa è l'unica soluzione di cui sopra che ha funzionato per me. Ora l'iTunes Store è soddisfatto della mia immagine.
Bill Cheswick il

7

La sezione Alpha Remove della Guida all'utilizzo di ImageMagick suggerisce l'utilizzo -alpha removedell'opzione, ad esempio:

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

... usando il -backgroundcolore che preferisci.

La guida afferma:

Questa operazione è semplice e veloce e fa il lavoro senza l'uso di memoria aggiuntiva o altri effetti collaterali che possono essere associati a tecniche di rimozione della trasparenza alternative. È quindi il modo preferito di rimuovere la trasparenza dell'immagine.

Aggiunge inoltre la nota:

Si noti che mentre la trasparenza viene "rimossa" il canale alfa rimarrà attivo, ma ora sarà completamente opaco. Se non è più necessario il canale alfa, è possibile utilizzare Alpha Off per disabilitarlo.

Pertanto, se non è necessario il canale alfa, è possibile ridurre le dimensioni dell'immagine di output aggiungendo l' -alpha offopzione, ad esempio:

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

Sono disponibili ulteriori dettagli su altre tecniche spesso utilizzate per rimuovere la trasparenza descritte nella sezione Rimozione della trasparenza dalle immagini .

In quella sezione è inclusa la menzione di un avvertimento importante per l'uso -flattencome tecnica per rimuovere la trasparenza:

Tuttavia, ciò non funzionerà con "mogrify" o con una sequenza di più immagini, fondamentalmente perché l'operatore "-flatten" è davvero progettato per unire più immagini in una singola immagine.

Quindi, se stai convertendo più immagini contemporaneamente, ad esempio la generazione di miniature da un file PDF, -flattennon farà ciò che desideri (appiattirà tutte le immagini per tutte le pagine in un'unica immagine). D'altra parte, l'uso della -alpha removetecnica produrrà comunque più immagini, ciascuna delle quali avrà la trasparenza rimossa.


5

Sembra che il tuo comando sia corretto, quindi il problema potrebbe essere dovuto alla mancanza di supporto per PNG (). Puoi verificare con convert -list configureo semplicemente provare quanto segue:

sudo yum install libpng libpng-devel

1
Sì grazie; questo (vecchio) problema era un bug in "graphicks magick", che è un fork / riscrivere / qualunque sia di "image magick".
Pointy

@Pointy vedo! Per curiosità, qual è stata la vera causa del problema (che era solo in una versione)?
Alastair,

Beh, davvero non so esattamente; era solo un bug. Non sono un manutentore di Graphicks Magick, quindi non ho idea del loro codice. Devo riprovare a un certo punto, immagino.
Pointy

ubuntu non ce l'ha? qui è libpng12-0 ma continua a non funzionare :(
Aquarius Power il

Sto usando Ubuntu 13.04 con libpng12-0installato e funzionante. Riesci a vedere PNG se esegui questo? convert -list configure | grep \png
Alastair,

5

Questa non è esattamente la risposta alla tua domanda, ma ho trovato la tua domanda mentre cercavo di capire come rimuovere il canale alfa, quindi ho deciso di aggiungere questa risposta qui:

Se vuoi rimuovere il canale alfa usando imagemagick, puoi usare questo comando:

mogrify -alpha off ./*.png

3

Spero che la mia decisione di installare "grafica magick" su "image magick" abbia dei bordi irregolari - quando reinstallo la vecchia "image magick" originale, allora il comando sopra funziona perfettamente.

modifica , molto tempo dopo - Uno di questi giorni verificherò se "grafica magick" ha risolto questo problema.


2

Avevo bisogno di entrambi: entrambi -alpha backgrounde -flatten, oppure -fill.

Ho realizzato un nuovo PNG con uno sfondo trasparente e un punto rosso al centro.

convert image.png -background green -alpha off green.png fallito: ha prodotto un'immagine con sfondo nero

convert image.png -background green -alpha background -flatten green.png prodotto un'immagine con lo sfondo verde corretto.

Naturalmente, con un altro file che ho rinominato image.png, non è riuscito a fare nulla. Per quel file, ho scoperto che il colore dei pixel trasparenti era "# d5d5d5", quindi ho riempito quel colore di verde:

convert image.png -fill green -opaque "#d5d5d5" green.png ha sostituito i pixel trasparenti con il verde corretto.


il comando corretto con ImageMagick corrente sarebbe convert image.png -background green -alpha background -alpha off green.pngo convert image.png -background green -alpha background -alpha remove green.pngoppure convert image.png -background green -flatten green.png
fmw42

1

Opzione da riga di comando: apri il file PNG in Windows Paint e fai clic su Salva.


0

questo crea un'immagine posizionando il primo con trasparenza sopra il secondo

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

originariamente trovato il suggerimento su questo post


0

Per rimuovere effettivamente il canale alfa dal file, utilizzare l' opzione alpha off :

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

1
In realtà, il link che hai fornito dice: "In realtà non elimina o destina il canale alfa attaccato all'immagine, disattiva semplicemente qualsiasi effetto che il canale ha sull'immagine". Per rimuovere davvero il canale alfa, vedi la mia risposta.
Rok Kralj,

0

Ho visto questa domanda e le risposte che mi aiutano davvero, ma poi mi è stato necessario farlo per molti file, quindi nel caso in cui tu abbia più immagini (immagini PNG) in una cartella e vuoi farlo per tutti:

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

-1

È -alpha off, NON -alpha remove! Il caricamento dell'app store iOS non riesce quando c'è un canale alfa in qualsiasi icona !!

Ecco come farlo: mogrify -alpha off * .png

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.