2017-10-28 2 views
0

Ich habe versucht, es zu übersetzen, aber funktioniert nicht, weiß niemand, was das Falsche ist?Wie übersetzt man den ImageMagick Befehl zu Imagick in PHP?

ImageMagick

convert source.jpg \(-size 640x480 xc:white -size 200x200 
xc:black -geometry +200+100 -compose over -composite \) 
+geometry -alpha off -compose copy_opacity -composite result.png 

PHP-Code mit Imagick habe ich versucht, aber hat nicht funktioniert:

//Open your image and get its dimensions 
$image = new Imagick('source.png'); 
$height = $image->getImageHeight(); 
$width = $image->getImageWidth(); 

//Create a new transparent image of the same size 
$mask = new Imagick(); 
$mask->newImage($width, $height, new ImagickPixel('white')); 

//Draw onto the new image the areas you want to be transparent in the original 
$draw = new ImagickDraw(); 
$draw->setFillColor('black'); 
$draw->rectangle($x, $y, $x + 200, $y + 200); 
$mask->drawImage($draw); 

//Composite the images 
$image->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); 
$image->setImageFormat('png'); 
$image->writeImage("~/images/result.png"); 

Ursprüngliche Frage:

How to make specified area of an image transparent with Imagick?

Ein weiterer Versuch

$width = 256; 
$height = 256; 
$x = 50; 
$y = 100; 
$fooWidth = 100; 
$fooHeight = 60; 


$image = new Imagick(); 
$image->newImage($width, $height, new ImagickPixel('yellow')); 


//Create a new transparent image of the same size 
$mask = new Imagick(); 
$mask->newImage($width, $height, new ImagickPixel('white')); 
$mask->setImageFormat('png'); 

//Draw onto the new image the areas you want to be transparent in the original 
$draw = new ImagickDraw(); 
$draw->setFillColor('black'); 
$draw->rectangle($x, $y, $x + $fooWidth, $y + $fooHeight); 
$mask->drawImage($draw); 

//Composite the images 
$image->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0); 

$image->setImageFormat('png'); 
$image->writeImage($path); 

COMPOSITE_COPYOPACITY Aussehen nicht funktioniert:

enter image description here

Antwort

1

versuchen Sie, beim Erstellen der Maske das Alpha am Ende auszuschalten. Dies funktioniert gut für mich:

convert -size 500x500 xc:yellow \(-size 500x500 xc:white -fill black -draw "rectangle 100,100 300,300" -alpha off \) -compose copy_opacity -composite result.png 

enter image description here

http://us3.php.net/manual/en/imagick.setimagematte.php Sehen Sie, wo das Beispiel

$mask->setImageMatte(false); 

Nach der Auslosung Befehl fügt und vor dem compositeImage() Befehl

+0

Unglaublich, es funktioniert, wie kann ich Ihnen danken, dass Sie so viel Zeit nehmen, um mir zu helfen, ich sehr sehr schätzen es :) – Suge

+1

'@ Suge' Froh zu hören, dass es geholfen hat. – fmw42

1

Zuerst Sie ein Rechteck mit den gleichen Koordinaten zeichnen. Sie müssen sie anders machen, um ein Rechteck zu erhalten.

$draw->rectangle(200, 100, 200, 100); 

sollte mehr sein wie

$draw->rectangle(100, 100, 200, 200) 

Dies wird ein Rechteck links oben von 100.100 und unten rechts auf 200.200 zeichnen. Das Rechteck wird also 100x100 groß sein.

Wenn Sie es wollen, wie meine Befehlszeile Beispiel sein, dann tun

$draw->rectangle(200, 100, 400, 300); 

Die oben links von 200.100 und unten rechts auf 400.300 so 200x200 groß sein würde.

Zweitens haben Sie kein Ausgabeformat angegeben. Wenn Sie an JPG schreiben, unterstützt es keine Transparenz. Stellen Sie sicher, dass Sie PNG oder TIF für die Ausgabe verwenden.

+0

Danke, ich habe ein Fehler bei "Rechteck", ich habe es korrigiert, aber es funktioniert immer noch nicht. Ist es richtig, 'Imagick :: ALPHACHANNEL_DEACTIVATE' als letzten Parameter von' compositeImage 'zu verwenden? – Suge

+0

Nein, das würde den Alphakanal entfernen. Tut mir leid, ich habe nicht genug geblättert, um das zu sehen. Ich benutze Imagick nicht, also weiß ich nicht, was ich dir für dieses Argument sagen soll.Von den Imagick-Dokumenten würde ich vorschlagen, dass Sie entweder die Standardeinstellung beibehalten oder sie auf CHANNEL_ALL setzen. – fmw42

+0

Aber Sie sehen, es gibt "-alpha off" im "ImageMagick" -Befehl, ich habe "-alpha on" getestet , das Ergebnis wird nicht als '-alpha off' richtig sein, also habe ich 'Imagick :: ALPHACHANNEL_DEACTIVATE' noch andere Möglichkeiten ausprobiert, funktioniert aber nicht alle. – Suge

Verwandte Themen