2012-01-02 13 views
25

Niewiele wiem o przetwarzaniu obrazu, a jeszcze mniej o używanej terminologii, więc proszę o zachowanie mnie.Jak używać Imagick do łączenia i maskowania obrazów?

Zasadniczo chcę scalić dwa obrazy razem, gdy jeden z nich będzie działał jak maska. Ten obraz wygląda mniej więcej tak:
Example Gdzie niebieskie i żółte tło są w rzeczywistości przezroczyste.

To zdjęcie jest używane jako maska ​​zwykłych zdjęć. Części zdjęcia, które "wystają" z okręgu, muszą być "przycięte" (być niewidoczne), gdy wnętrze pozostaje widoczne.
Wszystko co znajduje się w niebieskim obszarze jest niewidoczne, wszystko w żółtym obszarze jest widoczne.

Szczerze nie mam pojęcia, jak sobie z tym poradzić, więc wszelka pomoc byłaby ogromnie doceniona!

Edit:
używam wersji API Imagick, nie wersji poleceń

Edit:
Aby zorientować się, co chcę osiągnąć, to jest przykład.

wejściu obrazów są zatem:
enter image description here
To jest obraz maski, zawsze taka sama

enter image description here
To jest przykład z obrazem, dynamiczny

enter image description here
to co końcowy wynik powinien wyglądać tak, jak:

+0

naprawdę muszę odpowiedzieć na to pytanie . Moja wiedza jest zbyt ograniczona, aby sam ją zbadać, dlatego właśnie zaczynam nagrodę. Jeśli pytanie wymaga poprawy, chętnie to zrobię. –

+0

czy wersja wiersza poleceń może pomóc? –

+0

Jeśli nie można tego zrobić za pomocą interfejsu API, musiałbym odwołać się do interfejsu CLI, ale mam silną przychylność w stosunku do wersji interfejsu API. –

Odpowiedz

59

Więc ostatecznie, to powinien zrobić to, czego potrzebujesz:

Obraz oryginalny:

http://i.stack.imgur.com/b7seR.png

Krycie maska:

enter image description here

Overlay:

http://i.stack.imgur.com/3ulkM.png

wyjściowa:

enter image description here

Kod:

<?php 
$base = new Imagick('U0R4F.png'); 
$mask = new Imagick('mask.png'); 
$over = new Imagick('3ulkM.png'); 

// Setting same size for all images 
$base->resizeImage(274, 275, Imagick::FILTER_LANCZOS, 1); 

// Copy opacity mask 
$base->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA); 

// Add overlay 
$base->compositeImage($over, Imagick::COMPOSITE_DEFAULT, 0, 0); 

$base->writeImage('output.png'); 
header("Content-Type: image/png"); 

echo $base; 
?> 

Mam nadzieję, że to właśnie teraz! Uwaga: W twoim przykładzie wygląda na to, że przeskalowałeś podstawowy obraz, którego nie zrobiłem (moim celem jest pokazanie, jak robi się maskowanie).

+0

To wygląda obiecująco! Stworzę obraz maski i przetestuję ten kod. –

+0

Tak, myślę, że powinno nastąpić pewne skalowanie. Teraz przetestuję nowy kod. –

+1

Wspaniale, to prawie idealnie! Jeden problem, każda przezroczystość w oryginalnym obrazie jest przekształcana na czarny. Czy istnieje sposób na zachowanie kanału alfa? –

0

http://www.imagemagick.org/Usage/compose/#dstin powinno załatwić sprawę, ale musisz użyć obrazów z kanałami alfa (to nie powinno być problemu).

Edycja: w PHP trzeba go przekazać (imagick::COMPOSITE_DSTIN) jako parametr w compositeimage. Inne filtry w Composite Operator Constants również mogą ci się przydać.

+0

To naprawdę nie pomaga. Oczywiście znalazłem funkcję komponowania, ale po prostu nie wiem, jak połączyć dostępne narzędzia, aby uzyskać wynik, którego potrzebuję. –

1

Czy wypróbowałeś to rozwiązanie w sposób opisany przez: https://stackoverflow.com/a/2351173/1093649?

Uruchom to na swoim serwerze (z odpowiednimi nazwami obrazów!) I daj nam znać, dzięki.

Uwaga: kredyty przejść do jspash

+0

Już to znalazłem, ale tak naprawdę nie robi tego, co chcę. Efektem netto tej odpowiedzi jest to, że niebieskie i żółte części na obrazie pozostają przezroczyste, podczas gdy czarna ramka wyświetla obraz "tła". –

+0

Szkoda, czy możesz dołączyć oryginalne zdjęcia do swojego postu? W ten sposób możemy uzyskać lepszy pomysł, od czego zaczynasz. –

+0

Mam zaktualizowane pytanie z przykładowymi obrazami wejściowymi i wyjściowymi. –

0

Ten rodzaj maskowania jest przykładowa przy użyciu wielu różnych technik w ImageMagick przykładach, miniatury, Maski i Paint http://www.imagemagick.org/Usage/thumbnails/#mask_paint

Ostrzegamy jednak, że maskowanie i krawędzie obrazu nakładki nie powinien pasować to jest ważne lub możesz mieć problemy z efektami krawędziowymi, których najlepiej unikać.

Wyodrębnianie maski alfa pierścienia, można wykonać za pomocą operatorów morfologii, aby zmniejszyć ją do linii środkowej, można użyć do wygenerowania maski dla dowolnego losowego kształtu "pierścienia". ImageMagick przykładach Szkielety przez rozcieńczenie, i Przycinanie http://www.imagemagick.org/Usage/morphology/#thinning_skeleton

Anthony Thyssen Web master dla ImageMagick przykładach i Twórca dla ImageMagick

PS: ładne zdjęcie z Elfling

Powiązane problemy