2009-08-08 10 views
10

muszę zaciemniać pewien fragment obrazu za pomocą PHP i GD, obecnie używam następujący kod:PHP/GD Gaussian Blur Effect

for ($x = $_GET['x1']; $x < $_GET['x2']; $x += $pixel) 
{ 
    for ($y = $_GET['y1']; $y < $_GET['y2']; $y += $pixel) 
    { 
     ImageFilledRectangle($image, $x, $y, $x + $pixel - 1, $y + $pixel - 1, ImageColorAt($image, $x, $y)); 
    } 
} 

to w zasadzie zastępuje zaznaczony obszar z kwadratów $ piksele pikseli. Chcę osiągnąć jakieś rozmycia (Gaussian najlepiej) efekt, wiem, że mogę użyć ImageFilter() Funkcja:

ImageFilter($image, IMG_FILTER_GAUSSIAN_BLUR); 

Ale to zaciera całą płótnie, moim problemem jest to, że po prostu chcę rozmycie specyficzny powierzchnia.

Odpowiedz

12

Można skopiować określoną część obrazu do nowego obrazu, zastosować rozmycie na nowym obrazie i skopiować wynik z powrotem.

Coś jak to:

$image2 = imagecreate($width, $height); 
imagecopy ($image2 , $image , 0 , 0 , $x , $y , $width , $height); 
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR); 
imagecopy ($image, $image2, $x, $y, 0, 0, $width, $height); 
+0

Rzeczywiście, jest to miłe obejście jednak chciałbym jeszcze wiedzieć, jak ręcznie stworzyć efekt rozmycia. –

+0

Możesz sprawdzić to na wikipedia: http://en.wikipedia.org/wiki/Gaussian_blur#Implementation lub spójrz na podobne posty na StackOverflow: http://stackoverflow.com/questions/98359/fastest-gaussian-blur- implementacja, ale polecam używanie wbudowanej biblioteki. Te biblioteki używają skompilowanych algorytmów, aby przyspieszyć proces. – Scharrels

+0

Wziąłem sugestię, którą mi podarowałeś i muszę zapętlić ImageFilter 128 na wybranym obszarze, aby go zaciemnić, może używając niestandardowej implementacji, szybciej uzyskam wynik. –

2

nie sprawdzić w dokumentacji ImageFilter i nie wiem, czy to jest niemożliwe, lub jeśli nie jest równoznaczne z tym do stosowania (część) z obraz. Ale zakładając, że nie jest, to dlaczego nie:

  1. skopiować część chcesz plama na nowy (tymczasowy) obrazek GD (nie trzeba zapisać go na dysku, wystarczy przypisać go do nowej zmiennej temp).
  2. Zastosuj gaussowski filtr rozmycia do tego tymczasowego obrazu.
  3. skopiować powstały (filtrowane) obraz z powrotem skąd pochodzi (funkcjonalność to zrobić to z pewnością w bibliotece GD)
Powiązane problemy