2015-11-24 18 views
7

Ich habe ein Bild mit einem transparenten Hintergrund, den ich mit einem 5px Rahmen umreißen möchte. Im Photoshop kann ich es streichen, um dies zu erreichen.Umreißen Sie ein transparentes Bild mit imagick PHP

Ich habe versucht mit borderImage, aber es wird nicht den Pinguin skizzieren.

$image = new Imagick(); 
$image->readImage('tux.png'); 

$image->borderImage(new ImagickPixel('red'), 5, 5); // no outline 

Dies ist das Bild.

tux original

Dies ist, was ich erreichen will.

tux outlined

+0

Die Morphologie Zeug hat hier ein Beispiel http://phpimagick.com/Imagick/morphology?morphologyType=14 – Danack

Antwort

5

ich auf der Kommandozeile starten werden und kann die PHP später tun, oder lassen Sie heraus, dass etwas arbeiten ...

Schritt 1 - Transparenz Extract

Wie Sie haben gesehen, -border umreißt die ganze Bild, aber Sie wollen eigentlich die undurchsichtigen Bereiche nur so, dass Sie mit der Transparenz oder Alpha-Laye arbeiten müssen r. Lassen Sie uns extrahieren, dass zuerst:

convert tux.png -alpha extract alpha.png 

enter image description here

Schritt 2 - Get Kanten von opaken Bereich

Jetzt wollen Sie die Ränder dass skizziert, also werde ich -morphology verwenden:

enter image description here

Ich habe gehört, dass Leute Schwierigkeiten mit morphologischen Operationen in PHP haben, also hier ist eine alternative Methode für diesen Schritt, der keine Morphologie verwendet. Im Grunde dupliziert es die Alpha-Ebene und verwendet dann Statistiken, um das hellste Pixel in jeder 3x3-Box zu finden (was nur einen Effekt an den Kanten hat, wo schwarze und einige weiße Pixel in der 3x3-Box sind) und dann Differenzen das Ergebnis mit dem Original, um die betroffenen Pixel anzuzeigen. Einfacher als beschreiben!

convert alpha.png \(+clone -statistic maximum 3x3 -threshold 50% \) -compose difference -composite edge.png 

enter image description here

eine 5x5-Box für eine fettere Linie verwendet werden.

Ich sehe, es gibt eine -edge 5 Option, die viel einfacher ist - wir leben und lernen!

Schritt 3 - Make Kanten rot und Ruhe transparent

Jetzt können Sie die weiße sein wollen rot und schwarz transparent sein:

convert edge.png -fill red -opaque white -transparent black rededge.png 

enter image description here

Schritt 4 - Zusammengesetzte rote Kontur über Original

Und schließlich möchten Sie Composite, dass über Ihr original:

convert tux.png rededge.png -composite result.png 

enter image description here

Die ganze Schwein

Oder Sie alles auf einmal, wie dies tun:

convert tux.png \(+clone -alpha extract -morphology edge octagon -threshold 50% -fill red -opaque white -transparent black \) -composite result.png 

Sie können den subtileren Effekt von -morphology edgeout gegenüber -morphology edge bevorzugen.

PHP Version

Meine PHP-Kenntnisse sind "low", aber ich habe begonnen und mache einige Fortschritte - später aktualisieren wird, aber bisher sieht es wie folgt aus:

$image = new Imagick("tux.png"); 
    $alpha = clone $image; 
    $alpha->separateImageChannel(Imagick::CHANNEL_ALPHA); 
    $alpha->negateImage(true); 
    $alpha->edgeImage(5); 
    $alpha->opaquePaintImage("white","red",65000,FALSE); 
    $alpha->transparentPaintImage("black",0.0,0,FALSE); 
    $image->compositeImage($alpha,Imagick::COMPOSITE_DEFAULT,0,0); 
    $image->writeImage("result.png"); 

Das scheint ziemlich zu funktionieren, aber einige Aspekte könnten wahrscheinlich aufgeräumt werden - speziell die magische Zahl 65000 und vielleicht etwas unnötiges Klonen und so etwas - das werde ich Ihnen überlassen!

+0

Große Lösung! Ich habe versucht, es in PHP ohne Erfolg zu replizieren. Könnten Sie es in PHP konvertieren? – steve

+0

Ich habe versucht, ein paar amateurhafte PHP - ich werde Sie verlassen, um es zu Produktionsqualität zu verbessern :-) –

+0

Tolle Sachen, Mark! Ich schätze es. Fühlen Sie sich frei, es zu aktualisieren, wenn Sie müssen. – steve