Imposta lo sfondo trasparente usando ImageMagick e il prompt della riga di comando


120

Supponi di avere un'immagine (PNG o JPG). Questa immagine ha uno sfondo bianco e devo renderlo trasparente.

Ho provato con questi esempi:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

ma senza risultati desiderabili.

Come posso farlo?

IMPORTANTE: utilizzo della convertriga di comando.


Strano: pensavo che il comando pertinente fosse convert original.png -transparent white new.pngma dopo averlo provato, non riesco a farlo funzionare. Per inciso, sei sicuro che il tuo sfondo sia effettivamente bianco (#FFFFFF), o è solo quasi bianco (ad esempio #FEFEFE)?
matematico

@ matematical.coffee Ok ho capito, fammi controllare se non è così e continuerò questo thread. Grazie.
Israele

@ matematical.coffee Ciao di nuovo, ho controllato i colori e questa immagine ha uno sfondo come #FFFFFF, in altre parole "bianco". :( Non è questo il caso!
Israele

Risposte:


140

Sto usando ImageMagick 6.6.9-7 su Ubuntu 12.04.
Quello che ha funzionato per me è stato il seguente:

convert test.png -transparent white transparent.png

Ciò ha cambiato tutto il bianco nel test.png in trasparente.


6
Questo non ha funzionato per me finché non ho capito che JPG non sarebbe trasparente. Una volta passato a PNG, ha fatto esattamente quello che volevo - ho dovuto semplicemente cambiare "bianco" in "rgb ($ r, $ g, $ b)".
Roger Dueck

2
Dannazione! questo è fantastico!
agilob

2
Questo non solo convertirà lo sfondo in trasparente, ma anche ogni pixel bianco. C'è un modo per convertire lo sfondo solo in trasparente?
Alejandro Lozdziejski

2
@AlejandroLozdziejski - come definisci "sfondo"?
Jules

1
@AlejandroLozdziejski: Bella domanda. Si prega di consultare la mia soluzione che utilizza un riempimento dai bordi, cercando i colori approssimativamente uguali al pixel in alto a sinistra.
hackerb9

79

Ho avuto lo stesso problema. In cui devo rimuovere lo sfondo bianco dal formato immagine jpg / png usando ImageMagick.

Quello che ha funzionato per me è stato:

1) Converti il ​​formato dell'immagine in png: convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png


6
Questo è un bene, per avere un bordo più liscio tra lo sfondo trasparente e il primo piano opaco. Se converti icone rumorose in JPG in PNG e desideri aggiungere trasparenza, puoi anche aggiungere un filtro mediano:mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
Tomasz Gandor

44

Soluzione

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

Spiegazione

Questo è un po 'più lungo delle semplici risposte fornite in precedenza, ma dà risultati molto migliori: (1) La qualità è superiore grazie all'antialias alfa e (2) viene rimosso solo lo sfondo rispetto a un singolo colore. ("Sfondo" è definito come approssimativamente dello stesso colore del pixel in alto a sinistra, utilizzando un riempimento dai bordi dell'immagine.)

Inoltre, anche il canale alfa viene eroso di mezzo pixel per evitare aloni. Ovviamente, le operazioni morfologiche di ImageMagick non funzionano (ancora?) A livello di subpixel, quindi puoi vedere che sto facendo esplodere il canale alfa al 200% prima di erodere.

Confronto dei risultati

Ecco un confronto tra il semplice approccio ("-fuzz 2% -transparent white") e la mia soluzione, quando eseguito sul logo ImageMagick . Ho appiattito entrambe le immagini trasparenti su uno sfondo marrone chiaro per rendere evidenti le differenze (fare clic per gli originali).

La semplice sostituzione del bianco come trasparente non sempre funziona Alphachannel e floodfill con antialias hanno un aspetto molto migliore

Notate come la barba del Mago sia scomparsa nell'approccio semplice. Confronta i bordi della procedura guidata per vedere come l'alfa con antialias aiuta la figura a fondersi uniformemente con lo sfondo.

Naturalmente, ammetto completamente che ci sono momenti in cui potresti voler utilizzare la soluzione più semplice. (Ad esempio: è molto più facile da ricordare e se stai convertendo in GIF, sei comunque limitato a 1 bit alpha.)

script di shell mktrans

Poiché è improbabile che tu voglia digitare ripetutamente questo comando, ti consiglio di inserirlo in uno script. Puoi scaricare uno script di shell BASH da GitHub che esegue la mia soluzione suggerita. Può essere eseguito su più file in una directory e include commenti utili nel caso in cui si desideri modificare le cose.

bg_removal script

A proposito, ImageMagick in realtà viene fornito con uno script chiamato "bg_removal" che utilizza il riempimento inondazioni in modo simile alla mia soluzione. Tuttavia, i risultati non sono eccezionali perché utilizza ancora alfa a 1 bit. Inoltre, lo script bg_removal viene eseguito più lentamente ed è un po 'più complicato da usare (richiede di specificare due diversi valori fuzz). Ecco un esempio dell'output di bg_removal.

Lo script bg_removal: ha la barba, ma manca di antialiasing


2
Avevo bisogno di modificare il fuzz al 2%, perché l'immagine contiene una macchina bianca con sfondo bianco. E sebbene questo non sia perfetto al 100%, è la soluzione migliore che ho trovato perché non voglio farlo manualmente gimpo altro. :)
tukusejssirs

1
Ottima soluzione!
0x01h

29

Questo funziona per me:

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

dove minore è il fuzz%, più vicino al vero bianco o viceversa, maggiore è la%, maggiore è la variazione dal bianco che può diventare trasparente


1
Wow! Questo è esattamente ciò di cui avevo bisogno! prima: i.imgur.com/2Rd7w1N.png , dopo: i.imgur.com/4RTYygo.png
Dorian

Non funziona perfettamente perché non è in grado di gestire immagini con colore bianco e sfondo bianco. come le foto di briscola.
Sr. PHP Programmer Team Lead

Per il bianco su bianco, prova a utilizzare la soluzione di riempimento dell'inondazione che ho pubblicato sopra . Oppure usa il mio mktransscript di shell: github.com/hackerb9/mktrans
hackerb9

12

Puoi usarlo per rendere trasparente lo sfondo

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

Quanto sopra dà il prefetto sfondo trasparente


4
La shell potrebbe richiedere alcune citazioni di (): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Jim K.

7

Utilizzando ImageMagick, questo è molto simile al codice e al risultato di hackerb9, ma è una riga di comando un po 'più semplice. Presume che il pixel in alto a sinistra sia il colore di sfondo. Riempio semplicemente lo sfondo con la trasparenza, quindi seleziono il canale alfa e lo sfocato e rimuovo metà dell'area sfocata usando -level 50x100%. Quindi riaccendi tutti i canali e appiattiscilo contro il colore marrone. Il -blur 0x1 -level 50x100% agisce per antialiasare i confini della trasparenza del canale alfa. È possibile regolare il valore di fuzz, la quantità di sfocatura e il valore -level 50% per modificare il grado di antialiasing.

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg

inserisci qui la descrizione dell'immagine


Bello. Mi piace che tu ne abbia colto il succo in una riga succinta. Questo è simile a uno dei miei passaggi intermedi mentre scrivevo lo script. Ho deciso di non farlo perché (a) perde troppi dettagli nitidi, (b) volevo rendere ovvia la selezione del colore in modo che potesse essere facilmente modificata e (c) volevo riempire da tutti i bordi, non solo dalla parte superiore -angolo sinistro. (Potrebbero esserci altre cose che sto dimenticando in questo momento).
hackerb9

2
PS Immagino che "fmw" stia per Fred M. Weinhaus. Se è così, saluti, dottor Weinhaus! A chiunque non sappia chi è, ha scritto alcune delle ricerche fondamentali sulla computer grafica a partire dagli anni '70. Tutti dovrebbero controllare la sua straordinaria conucopia di script di shell ImageMagick su fmwconcepts.com/imagemagick .
hackerb9

1
@ hackerb9: Sì, sono io. Ci conosciamo? Mandami una mail se lo desideri. Il mio indirizzo email è sulla mia pagina web che hai collegato.
fmw42

4

Se vuoi controllare il livello di trasparenza puoi usare rgba. dove a è l'alfa. 0 per trasparente e 1 per opaco. Assicurati che il file di output finale debba avere l'estensione .png per la trasparenza.

convert 
  test.png 
    -channel rgba 
    -matte 
    -fuzz 40% 
    -fill "rgba(255,255,255,0.5)" 
    -opaque "rgb(255,255,255)" 
       semi_transparent.png

1

Sì. Ho avuto anche lo stesso problema. Ecco il comando che ho eseguito e ha funzionato perfettamente: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

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.