zacznę w linii poleceń i może zrobić PHP później, albo niech pan działa w ten trochę się ...
Krok 1 - Wyciąg przejrzystość
Jak Widzieliście, -border
przedstawia cały obraz, ale faktycznie chcecie obrysować tylko obszary nieprzezroczyste, więc trzeba pracować z przezroczystością lub alfa laye r. Załóżmy wyodrębnić, że najpierw:
convert tux.png -alpha extract alpha.png
Krok 2 - Get krawędzie nieprzezroczystej powierzchni
Teraz chcesz krawędzie nakreślonej, więc użyję -morphology
:
convert alpha.png -morphology edge octagon -threshold 50% edge.png
Słyszałem, że ludzie mają problemy z operacjami morfologicznymi w PHP, więc tutaj jest alternatywna metoda dla tego kroku, która nie używa morfologii. Zasadniczo duplikuje warstwę alfa, a następnie wykorzystuje statystyki w celu znalezienia najjaśniejszego piksela w każdym polu 3x3 (które ma tylko efekt na krawędziach, gdzie jest trochę czarnych i niektórych białych pikseli w pudełku 3x3), a następnie różnice wynik z oryginałem, aby pokazać dotknięte piksele. Łatwiej to po prostu zrobić, niż opisać!
convert alpha.png \(+clone -statistic maximum 3x3 -threshold 50% \) -compose difference -composite edge.png
Użyj pola 5x5 na grubsze linii.
Widzę, że jest opcja -edge 5
, która jest o wiele łatwiejsza - żyjemy i uczymy się!
Krok 3 - Dodać krawędzie czerwony i odpoczynek przezroczysty
Teraz chcesz biała być czerwona i czarna być przejrzyste:
convert edge.png -fill red -opaque white -transparent black rededge.png
Krok 4 - Złożony czerwony kontur nad oryginalnym
I wreszcie, chcesz composite, że przez swój oryginalny:
convert tux.png rededge.png -composite result.png
Cały Hog
Albo można zrobić wszystko za jednym razem tak:
convert tux.png \(+clone -alpha extract -morphology edge octagon -threshold 50% -fill red -opaque white -transparent black \) -composite result.png
Możesz preferować bardziej subtelny efekt -morphology edgeout
niż -morphology edge
.
Wersja PHP
Moje umiejętności PHP są "niski", ale zaczęłam i robię pewne postępy - zaktualizuje później, ale do tej pory wygląda to tak:
$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");
Wydaje się, że to dość dużo pracy, ale niektóre aspekty można prawdopodobnie uporządkować - konkretnie numer magiczny 65000
i może jakieś niepotrzebne klonowanie i inne rzeczy - zostawię to tobie!
Morfologia ma tutaj przykład: http://phpimagick.com/Imagick/morphology?morphologyType=14 – Danack