luq techblog

o tworzeniu słów kilka…

Filtry graficzne w PHP 17 marca 2009

Filed under: PHP,Programowanie — Łukasz @ 13:15
Tags: , ,

Powracając do captchy orange, o której pisałem w jednym z moich poprzednich postów. Jak można było przeczytać, najpierw należy przetworzyć obrazek w taki sposób aby była możliwość odseparowania kolejnych znaków z obrazka. Do tego celu należy użyć kilku filtrów graficznych, o czym właśnie będzie ten wpis.

 

Standardowo w tej bibliotece GD istnieję funkcja imagefilter()

bool imagefilter ( resource $image , int $filtertype [, int $arg1 [, int $arg2 [, int $arg3 [, int $arg4 ]]]] ),

która to, umożliwia zastosowania na obrazku kilku prostych filtrów m.in. skala szarości (grayscale), rozmycie gaussowskie (gaussaian blur), rozycie selektywne (selective blur), kontrast itd. Dwa powody dla których z niej nie korzystam to:

Informacja: Ta funkcja jest dostępna tylko jeśli PHP zostało skompilowane z dołączoną wersją biblioteki GD.

i przez to na serwerach do których nie mamy dostępu (darmowych) jeśli PHP nie został skompilowany razem z biblioteką GD cały mój skrypt nie ruszy. Jednak chciałbym się pozbyć tej niegodności.

Drugim powodem jest działanie funkcji imagefilter. Obrazek jest pobieramy i wszystkie operację są przeprowadzana na oryginale. Funkcja nie zwraca przetworzonego obrazka, a to mi się bardzo nie podoba. Jak na moje oko w manualu powinno być napisane:

bool imagefilter ( resource &$image , int $filtertype [, int $arg1 [, int $arg2 [, int $arg3 [, int $arg4 ]]]] ).

 

Dokładnie z tych 2 powodów, postanowiłem napisać własną klasę do obsługi filtrów, o nazwie Filter. Nie będę tu jej opisywał, trochę dalej rzucę tylko link do pobrania.

 

Jak na razie klasa umożliwia:

  • załadowanie obrazka
  • zapisanie obrazka
  • filtr skali szarości
  • filtr progowania
  • filtr negatywu
  • odwrócenie horyzontalne
  • odwrócenie wertykalne
  • odszumianie obrazka
  • dodanie kanału aplha
  • przejście liniowe przezroczystości (czy jak to inaczej nazwać)

Dodatkowo, metody chronione o funkcji:

  • porównanie dwóch pixeli
  • Pobranie kolorów sąsiednich pixeli

Dzięki zabawie w pisanie tej klasy, trochę zainteresowałem się grafiką komputerową (tą „normalną” a nie Corelem czy innym Photoshopem, którego uczą w technikum na lekcjach Grafiki komputerowej i Multimediach). Wczoraj otwierając swojego foobara z nakładką fooAvA i patrząc na okładkę albumu:

pomyślałem, że fajnie by było takie odbicie napisać w PHP :) Właśnie dzięki temu została stworzona metoda umożliwiająca przejście liniowe przezroczystości oraz klasa potomna o nazwie CdFilter. CdFilter ma jak na razie jedną metodę createFlipCd()

 

Dzięki temu możemy stworzyć coś takiego (chodzi o te odbicie okładki):


Może i się komuś przyda ;] Oczywiście uwagi co do kodu mile widziane :>

 

Paczka (Filter.class.php, CdFilter.class.php oraz przykład)

 

PS. Coraz bardziej denerwuje mnie serwer, a raczej brak dostępu do niego :/

Reklamy
 

One Response to “Filtry graficzne w PHP”

  1. klusek Says:

    Mądre rzeczy tu piszesz sałat;]


Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s