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](https://i.stack.imgur.com/WwQPZ.png)
Schritt 2 - Get Kanten von opaken Bereich
Jetzt wollen Sie die Ränder dass skizziert, also werde ich -morphology
verwenden:
![enter image description here](https://i.stack.imgur.com/e0PfF.png)
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](https://i.stack.imgur.com/AhVXg.png)
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](https://i.stack.imgur.com/2ZRMb.png)
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](https://i.stack.imgur.com/N5z3o.png)
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!
Die Morphologie Zeug hat hier ein Beispiel http://phpimagick.com/Imagick/morphology?morphologyType=14 – Danack