2012-11-05 35 views
13

Tôi cố gắng tạo lại tập lệnh sử dụng lệnh ImageMagick "chuyển đổi" để soạn một hình ảnh. Nhưng tôi muốn làm điều tương tự trong PHP bằng Imagick (phiên bản 6.6.2-10).Imagick: soạn với mặt nạ

Các lệnh này như sau:

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 

tôi phát hiện ra rằng các tham số đứng sau:

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

Các PHP Imagick mang lại cho tôi một phương pháp soạn, nhưng không có một tham số mặt nạ: http://www.php.net/manual/en/imagick.compositeimage.php

Tôi đã tìm thấy another question và thử điều này (nhưng không dẫn đến cùng một hình ảnh):

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

Vì vậy, câu hỏi của tôi là: đây có phải là cách thích hợp để tạo hình ảnh bằng mặt nạ không? Hay có gì sai ở đây?

Để giúp hình dung những gì tôi muốn làm, sau đây là một số hình ảnh đầu vào:

hình ảnh đầu vào a1 (nền):

a1

hình ảnh đầu vào a3 (overlay):

a3

hình ảnh đầu vào a4 (mặt nạ):

a4

Những gì tôi muốn kết quả là:

correct output

gì mã php của tôi tạo ra:

wrong output

Cảm ơn trước! Michael

+1

tại sao bạn không sử dụng cờ COMPOSITE_OVERLAY – artragis

Trả lời

2

hãy thử sử dụng phương pháp compositeImage và Imagick :: COMPOSITE_COPYOPACITY

0

Hãy thử mã này:

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

Trong khi đoạn mã này có thể là giải pháp, [bao gồm giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-‌ code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – yivi