Converti l'immagine in scala di grigi in immagine del canale alfa nella shell unix


14

Ho un'immagine in scala di grigi. Voglio convertirlo in un PNG trasparente, in modo che i pixel neri (nell'immagine originale) diventino completamente opachi, i pixel bianchi diventino completamente trasparenti, un pixel grigio al 50% diventerebbe trasparente al 50%, e così via per tutte le sfumature nel mezzo.

Come posso raggiungere questo obiettivo?

(Sì, so che questa è quasi la stessa domanda della conversione delle tonalità di scala di grigi in canale alfa , ma voglio sapere come farlo utilizzando solo gli strumenti della riga di comando, ad esempio ImageMagick o NetPBM.)

Ecco un risultato di esempio dalla domanda di cui sopra. Questo esempio è un risultato che vorrei ottenere utilizzando solo gli strumenti da riga di comando.

Campione

Se apri questo PNG in un visualizzatore che supporta la trasparenza, vedrai cosa intendo.

Risposte:


18

Ooookay. Dopo aver cercato su Google e aver letto più del manuale di ImageMagick di quello a cui tengo davvero, ecco la risposta. Dato che hai un'immagine in scala di grigi chiamata source.png, ecco i miei comandi.

Per rendere trasparenti i pixel neri e mantenere i pixel bianchi così come sono, eseguire questo comando:

 convert source.png -alpha copy -fx '#fff' result.png

Per rendere trasparenti i pixel bianchi mantenendo il nero così com'è, utilizzare:

 convert source.png -alpha copy -channel alpha -negate +channel -fx '#000' result.png

Spieghiamo un po 'più a fondo quell'ultimo comando:

  • convert - È il comando ImageMagic (uno dei tanti)
  • source.png - L'immagine sorgente in scala di grigi.
  • -alpha copy - Copia i contenuti del file precedente nel canale alfa.
  • -channel alpha - Specificare che solo i seguenti operatori dovrebbero influire sul canale alfa.
  • -negate- Invertire il canale alfa (a causa della precedente -chanel alphanon influirà su nessun'altra parte dell'immagine).
  • +channel- Specificare che solo i seguenti operatori dovrebbero influire sui canali di colore e non modificare più il canale alfa. (Questo è il valore predefinito e pertanto non è necessario fornirlo nel primo esempio più semplice.)
  • -fx '#000'- Sostituisci i contenuti del canale di colore con pixel neri. (A causa del +channelcanale alfa non sarà interessato).

È abbastanza importante includere quell'opzione finale -fx, altrimenti tutti i pixel semitrasparenti nell'immagine generata manterranno i colori. (Poiché questi pixel sono semitrasparenti, potrebbe non essere ovvio, ma il risultato finale non è quello che ci si aspetta.)

Ho trovato abbastanza utile l'elenco delle opzioni di ImageMagick .


spiegazione abbastanza buona per raggiungere il mio obiettivo, quando sto usando il secondo comando che rende la mia immagine più scura dell'immagine reale in scala di grigi. In realtà, il mio obiettivo è quello di ottenere la stessa tonalità di colore presente in scala di grigi oltre a quella trasparenza, come previsto. qualche idea per raggiungerlo?
Hardik Patel,

è molto utile, grazie! :) felice di non doverlo capire da solo
Sam Watkins,

Ti amo!!!!!!
mescarra,

Questi tipi di commenti sono probabilmente migliori da inviarmi tramite questo canale: okcupid.com/profile/zrajm :)
zrajm,

1
non so perché, ma con la versione corrente (ImageMagick 7.0.7-21) di conseguenza ottengo solo un'immagine bianca / nera solida, senza alcun canale alfa. Ho copiato la riga di comando alla lettera, modificando solo i percorsi dei file di input / output. Forse hanno apportato alcune modifiche incompatibili all'indietro.
Visualizza nome

0

Con ImageMagick 7.0, la risposta sopra non funziona più. Ma puoi usare:

convert source.png -channel rgb -fx '#fff' result.png

Alka, riempi i canali RGB di spazi vuoti e lascia l'alfa come prima.


Sospetto che ti sia sfuggita la '-alpha copy' :)
Chris,

0

Con imagemagick 7, trovo che sia necessario specificare -channel RGBprima di -fx, altrimenti si ottiene un'immagine nera piena, in questo modo:

convert input.png -alpha copy -channel RGB -fx '#000' out.png

E negare è utile se vuoi che il nero sia opaco e il bianco sia trasparente:

convert input.png -negate -alpha copy -channel RGB -fx '#000' out.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.