2012-11-05 11 views
13

Ich versuche ein Skript neu zu erstellen, das den ImageMagick-Befehl "convert" verwendet, um ein Bild zu erstellen. Aber ich möchte das gleiche in PHP mit Imagick (Version 6.6.2-10) machen.Imagick: komponieren mit Maske

Der Befehl lautet wie folgt:

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 

Ich fand heraus, dass die Parameter für die folgenden stehen:

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

Die PHP Imagick gibt mir ein compose Methode, aber ohne Maske Parameter: http://www.php.net/manual/en/imagick.compositeimage.php

Ich fand another question und versucht dies (aber nicht das gleiche Bild):

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

Also meine Frage ist: Ist das der richtige Weg, um ein Bild mit einer Maske zu komponieren? Oder was ist hier falsch?

Visualisierung zu helfen, was ich tun möchte, hier sind einige Eingabebilder:

Eingangsbild a1 (Hintergrund):

a1

Eingangsbild a3 (Overlay):

a3

Eingabebild a4 (Maske):

a4

Was möchte ich das Ergebnis sein:

correct output

Was Code mein PHP erstellt:

wrong output

Vielen Dank im Voraus! Michael

+1

, warum Sie nicht die Flagge COMPOSITE_OVERLAY – artragis

Antwort

2

versuchen compositeImage mit der Methode und Imagick :: COMPOSITE_COPYOPACITY

0

diesen Code Versuchen:

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

Während dieser Code-Schnipsel verwenden kann die Lösung sein, [einschließlich eine Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) hilft wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. – yivi