luq techblog

o tworzeniu słów kilka…

Filtrów ciąg dalszy… 19 listopada 2009

Filed under: PHP,Programowanie — Łukasz @ 19:26
Tags: , ,

Witam od niepamiętnych czasów. Brak pomysłów na wpisy jak i czasu spowodował tak długą przerwę, aktualnie jestem chory także mogłem napisać ten wpis.

 

Już dawno, pojawił się wpis o mojej własnej klasie do manipulacji obrazkami z wykorzystaniem GD. Jednak po tych kilku miesiącach, gdzie coraz częściej zdarza mi się pisać obiektowo, (właściwie wyłącznie obiektowo) stwierdziłem, że klasa jest bez sensu. Właściwie do początku miałem świadomość tego, że jest to kontener na funkcję (praktycznie wszystkie metody były statyczne). Było tak dlatego aby pozostawić sobie możliwość tworzenia dwóch przekształceń obrazka np. do połowy ta samo – mamy oryginalny obrazek z którego chcemy stworzyć jego wersję obróconą wertykalnie + skala szarości oraz drugą wersję obróconą wertykalnie + powiedzmy negatyw. Ale przecież jest można klonować obiekty wykorzystując clone.

 

Tak więc siadłem kiedyś do modernizacji klasy (prace dokończyłem dzisiaj), i chciałbym zaprezentować jej możliwości, a przy okazji opisać jak operuje się na pixelach aby otrzymać takie proste filtry.

 

Przyda się kilka wyjaśnień co do używanych prze zemnie terminów, które są w zasadzie trywialne, ale dla mniej siedzących w temacie, tłumacze. Jeden kolor (jeden pixel wyświetlany na ekranie) składa się z 3 barw składowych (3 subpixeli) w których skład wchodzą Red, Green oraz Blue. Dodatkowo używane jest także czwarte „pole” tzw. kanał alpha, który mówi nam o przezroczystości wynikowej barwy. Każda składowa mówiąca o kolorze może przyjmować wartość od 0 do 255, natomiast kanał alpha jest ograniczony od 0 do 127. Kolory otrzymujemy mieszając składowe RGB, a przez to że mamy dostępnych 256^3 kombinacji poszczególnych składowych możemy stworzyć 16.581.375 różnych barw. Co do kanału alpha. Jeżeli jest on równy 127 to pixel jest niewidoczny (właściwie maksymalnie przezroczysty), natomiast jeśli jest równy 0 – pixel jest całkowicie widoczny. Jeszcze chyba ostatnia informacja. W komputerach grafika jest przedstawiana w układnie współrzędnych innym niż kartezjański. Nie mamy wartości ani argumentów ujemnych, więc wygląda to tak – lewy górny róg ekranu (obrazka or sth.) to punkt (0, 0), iksy rosną ku prawej, natomiast igreki ku dołowi.

 

(more…)

 

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.

 

(more…)