2012-11-05 12 views
13

Próbuję odtworzyć skrypt, który wykorzystuje komendę ImageMagick "konwertuj" do komponowania obrazu. Ale chcę zrobić to samo w PHP używając Imagick (wersja 6.6.2-10).Imagick: skomponuj z maską

Polecenie jest następujące:

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 

I okazało się, że parametry stoją za:

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

PHP Imagick daje mi sposób komponować, ale bez parametru maski: http://www.php.net/manual/en/imagick.compositeimage.php

Znalazłem another question i próbowałem tego (ale nie dało tego samego obrazu):

// 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); 

Moje pytanie brzmi: czy jest to właściwy sposób komponowania obrazu za pomocą maski? A co tu jest nie tak?

Aby pomóc w wizualizacji, co chcę zrobić, oto kilka zdjęć wejściowe:

obrazu wejściowego A1 (tło):

a1

wejścia obrazu a3 (overlay):

a3

obraz wejściowy a4 (maska):

a4

co chcę być wynikiem:

correct output

Co mój kod php tworzy:

wrong output

Dzięki z góry! Michael

+1

dlaczego nie można użyć flagi COMPOSITE_OVERLAY – artragis

Odpowiedz

2

spróbować użyć metody compositeImage i Imagick :: COMPOSITE_COPYOPACITY

0

Spróbuj kod:

// 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

Podczas tego fragmentu kodu może być rozwiązanie, [w tym wyjaśnienie] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – yivi