2012-11-13 10 views
6

Ho file PNG che vorrei convertire l'intera immagine in semitrasparente. L'immagine verrà referenziata in un file KML come una sovrapposizione di icone da utilizzare in Google Earth/Maps.Creazione di un PNG semitrasparente con ImageMagick su Centos Linux

I seguenti esempi sono stati suggeriti utilizzando il comando di conversione ImageMagick, tuttavia nessuno dei due sembra funzionare. Il primo esempio genera un errore, il secondo esempio non riesce a apportare alcuna modifica osservabile all'immagine.

$ /usr/local/bin/convert 121112142121.png -channel Alpha -evaluate Set 50% 2121112142121.png 
convert: no decode delegate for this image format '121112142121.png' @ error/constitute.c/ReadImage/550. 
convert: option requires an argument '-evaluate' @ error/convert.c/ConvertImageCommand/1400. 

Il secondo metodo suggerito è stato questo:

convert filename.png -fill '#00000080' -draw 'matte 100,100 reset' output.png 

Mentre posso trovare molti esempi sul web per la creazione di immagini completamente trasparenti da colori specifici o maschere alfa, io non riesco a trovare alcuna che funzionano per creare immagini semitrasparenti. Mi piacerebbe trovare un modo per farlo con il comando convert, o con ImageMagick Perl.

La versione di ImageMagick è 6.8.0-4.

risposta

12

risoluzione è stata trovata:

convert input.png -alpha set -channel A -evaluate set 50% output.png 

Il comando sopra rende l'intera immagine (tutti i colori) semi-trasparente.

Un altro problema che ho riscontrato è che l'ultima versione di ImageMagick è stata compilata dalla sorgente senza tutte le librerie di immagini più recenti installate (in particolare libpng). Presta molta attenzione all'output di configure per assicurarti che libpng venga trovato se compila dalla fonte. Sembra inoltre che le versioni di ImageMagick precedenti alla 6.6 e/o versioni precedenti di libpng potrebbero non supportare la generazione png trasparente.

+8

Puoi anche usare '-valutazione di Divide 2' se vuoi renderlo indipendente dall'immagine originale (solo il doppio della trasparenza per tutti i pixel). – caw

+6

Il problema con questo approccio è che se hai già dei pixel completamente trasparenti nell'immagine, la loro trasparenza sembra cambiare e renderli semi-trasparenti neri :(Qualche idea? –

0

Per dare seguito al commento di Tony Bogdanov. Se si dispone già di pixel completamente trasparenti si consiglia di utilizzare la seguente strategia:

1.) convertire i pixel trasparenti in una maschera

convert -alpha extract input.png mask.png

2.) eseguire il comando indicato nella risposta precedente :

convert input.png -alpha on -channel a -evaluate set 65% output.png

3.) creare una tela bianca le stesse dimensioni dell'immagine originale

esempio: convert -size 700x800 xc:none blankcanvas.png

4.) composito l'immagine semitrasparente e la tela bianca insieme usando la maschera di pixel trasparente

composite output.png blankcanvas.png mask.png -compose Src final_output.png

4
convert input.png -alpha set -channel A -evaluate Divide 2 output.png 

Grazie @caw per la precisazione nel tuo commento. Questo aiuta nel caso in cui l'immagine abbia già alcuni pixel trasparenti. -evaluate set 50% rovina i pixel già trasparenti con alfa 0, impostando il loro alfa sul 50%, che spesso non è desiderabile.

-evaluate Divide 2 conserva l'alfa, poiché i pixel completamente trasparenti sono alfa 0 e 0 diviso per 2 è ancora 0.