2012-11-05 18 views
13

Provo a ricreare uno script che usa il comando ImageMagick "convert" per comporre un'immagine. Ma voglio fare lo stesso in PHP usando Imagick (versione 6.6.2-10).Imagick: componi con maschera

Il comando è la seguente:

convert A1.mpc A3.mpc A4.mpc -channel rgba -alpha on -virtual-pixel background -background none -define compose:args=312x26.6776 -compose displace -composite out.mpc 

ho scoperto che i parametri rappresentano le seguenti:

convert {background} {overlay} [{mask}] [-compose {method}] -composite {result} 

Il PHP Imagick mi dà un metodo di composizione, ma senza un parametro della maschera: http://www.php.net/manual/en/imagick.compositeimage.php

Ho trovato another question e ci prova (ma non risulta nella stessa immagine):

// load images 
$a1 = new Imagick('a1.png'); 
$a3 = new Imagick('a3.png'); 
$a4 = new Imagick('a4.png'); 

// mask the overlay 
$a1->compositeImage($a4, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA); 

// compose overlay to background 
$a1->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BACKGROUND); 
$a1->setImageBackgroundColor(new ImagickPixel('none')); 
$a1->setOption('compose:args', '312x26.6776'); 
$a1->compositeImage($a3, Imagick::COMPOSITE_DISPLACE, 0, 0); 

Quindi la mia domanda è: è questo il modo giusto per comporre un'immagine usando una maschera? O cosa c'è che non va qui?

Per aiutare a visualizzare quello che voglio fare, ecco alcune immagini in ingresso:

immagine in ingresso A1 (sfondo):

a1

immagine in ingresso a3 (overlay):

a3

ingresso immagine a4 (maschera):

a4

Quello che voglio che il risultato sia:

correct output

Ciò che il mio codice PHP crea:

wrong output

Grazie in anticipo! Michael

+1

perché non si utilizza il flag COMPOSITE_OVERLAY – artragis

risposta

2

provare a utilizzare il metodo compositeImage e Imagick :: COMPOSITE_COPYOPACITY

0

provare questo codice:

// x-displacement 
$a3->setImageArtifact('compose:args', "312x0"); 
$a1->compositeImage($a3, Imagick::COMPOSITE_DISPLACE, 0, 0); 

// y-displacement 
$a4->setImageArtifact('compose:args', "0x26.6776"); 
$a1->compositeImage($a4, Imagick::COMPOSITE_DISPLACE, 0, 0); 
+4

Mentre questo frammento di codice può essere la soluzione, [tra cui una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-entely- code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – yivi