2015-11-24 36 views
7

Mam obraz z przezroczystym tłem, który chciałbym obrysować za pomocą granicy 5 pikseli. W Photoshopie mogę go pogłaskać, aby to osiągnąć.Zarys przezroczystego obrazu za pomocą grafiku PHP

Próbowałem już używać borderImage, ale nie będzie to oznaczać pingwina.

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

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

To jest obraz.

tux original

To jest to, co chcę osiągnąć.

tux outlined

+0

Morfologia ma tutaj przykład: http://phpimagick.com/Imagick/morphology?morphologyType=14 – Danack

Odpowiedz

5

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 

enter image description here

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 

enter image description here

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 

enter image description here

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 

enter image description here

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 

enter image description here

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!

+0

Świetne rozwiązanie! Próbowałem replikować go w PHP bezskutecznie. Czy możesz przekonwertować go na PHP? – steve

+0

Podjęłam próbę jakiegoś amatorskiego PHP - zostawię Cię, abyś ulepszył go do jakości produkcji :-) –

+0

Świetne rzeczy, Mark! Doceniam to. Jeśli chcesz, możesz go zaktualizować. – steve