PHP - grafika w PHP
| DZIAŁANIE: | Kliknij na link: 106grafika_obraz_z_istniejacego_dzialanie.php |
Kod:

Ewentualne Objaśnienia:
Do zrobienia samodzielnie tego przykładu potrzeba nam już gotowych plików
graficznych - u mnie PNG przedstawiających poszczególne cyfry czyli od 0 do 9.
Ja umieściłem je sobie w katalogu grafika_cyfry - co też widać w kodzie. Nazwy
tych obrazków powinny odpowiadać cyfrą jakie przedstawiają, czyli obraz z cyfrą
0 powinien sie nazywać 0.png ( albo inne rozszerzenie graficzne prawda ) z cyfrą
5 - 5.png itd itd. Warto zwrócić uwagę na rozmiar naszych już gotowych obrazków
- u mnie jest to 15na19 pikseli - oczywiście możecie mieć obrazy o innych
wymiarach - ważne jednak aby te wymiary były dla każdego obrazka identyczne i
należy je sprawdzić - a po co to się dowiecie za chwilę.
Jak widać w kodzie będziemy generować obrazek PNG - składający się w moim
przypadku -a raczej wykorzystujący gotowe obrazy również w formacie PNG - jednak
jeżeli zadeklarowalibyśmy w nagłówku, że tworzymy obraz PNG - a nasze gotowe
obrazy z cyframi byłyby innego formatu ( na przykład GIF ) to również działałoby
to poprawnie.
Popatrzmy więc teraz dokładnie na kod, będę omawiał co się dzieje oraz
nowo poznane funkcje :
- stworzyliśmy własną funkcję - drukujliczbę - zobaczmy co się w niej dzieje -
najpierw należy określić ile nasza - podana w formularzu liczba posiada cyfr -
jest to prosto zrealizowane - pierw ustalamy zmienną $liczbacyfr na 1 bo
wiadomo, że każda liczba jedną cyfrę na pewno ma - dalej w pętli - zliczamy ile
razy naszą podaną liczbę da się podzielić przez 10. Jak widać funkcja floor w
pętli podaje nam całkowitą część dzielenia naszej liczby przez 10 - mechanizm
ten jest prosty - weźmy dla przykładu liczbę 999 - zmienna $liczbacyfr jest 1,
zaczyna się pętla - 999 jest większe od 10, $liczbacyfr = 2, 999/10 = 99,9 -
część całkowita 99, dalej znowu pętla 99 jest większe od 10, $liczbacyfr = 3,
99/10 = 9,9 - część całkowita = 9, jest mniejsza od 10 pętla kończy działanie -
nasza zmienna $liczbacyfr wynosi 3 - zgadza się !
Dalej w funkcji określamy nagłówek - obraz PNG. Następnie tworzymy obrazek o wymiarach - 15*$liczbacyfr, 20 - dlatego, że jak mówiłem moje gotowe obrazki PNG mają 20px wysokości oraz 15px szerokości.
Dalsze operacje - tworzenie naszego rysunku odbywa się w pętli - wydaje się
to być dość skomplikowane - proponuje każdemu z Was wziąć sobie jakąś cyfrę - na
przykład 999 - i rozpisać sobie na zwykłej kartce co się po kolei dzieje ze
zmiennymi w tej pętli - takie coś kształci i rozwija wyobraźnie.
Ogólnie mówiąc - pierwszą cyfrę liczby określamy dzieląc ją całkowicie ( funkcja
floor - przypominam ) przez liczbę, która określa jej rząd - największa potęga
liczby 10 mniejsza od niej czyli dla liczby na przykład 999 - jest to 102
czyli 100 ( bo 103 byłoby już za duże bo 1000>999) --> dzieje się to
wszystko w zmiennej $cyfra, dalej w zmiennej $numer - odcinamy kolejne cyfry
naszej podanej liczby ( ale od początku ) czyli mieliśmy na przykład to 999,
dzielimy w pierwszym powtórzeniu pętli przez 102 i zostaje nam 9,99 -
jako, że mamy znak % - to zostaje nam zapisane do zmiennej $numer liczba 99 - i
to na tej wartości potem w kolejnym powtórzeniu pętli będą przeprowadzane
operacje przez zmienną $cyfra oraz znowu $numer.
Po określeniu zmiennych $cyfra i $numer w pętli - oznaczamy zmienną $rysunekcyfra jako funkcję - imagecreatefrompng - czyli jest to funkcja do tworzenia obrazu na podstawie już istniejącego - rzecz logiczna dla GIF byłoby to imagecreatefromgif itp , jak widać w kodzie parametrem tej funkcji jest już istniejący plik graficzny - u nas w pętli odpowiadający cyfrze z naszej liczby plik $cyfra.png w katalogu grafika_cyfry.
Dalej najważniejsza w tym przykładzie funkcja - imagecopyresized - jest to funkcja, która kopiuje do jednego rysunku inny, konkretnie :
imagecopyresized - parametry:
1 - rysunek docelowy - ten, do którego kopiujemy;
2 - rysunek źródłowy - widać to dokładnie w naszym przykładzie;
3 - współrzędna X miejsca, w którym miejscu rysunek ma się znaleźć - u nas
zrealizowane zapisem - ($liczbacyfr-$i)*15 - dlaczego tak ? Przy pierwszym
położeniu pętli będzie to: (3-3)*15 = 0, przy drugim (3-2)*15 = 15, przy
ostatnim trzecim = (3-1)*15 = 30 -->dlatego tak bo obrazki te - cyfry muszą być
obok siebie, a 15 dlatego oczywiście bo nasze gotowe obrazki mają ( przynajmniej
te moje) szerokość 15pikseli;
4 - współrzędna Y miejsca, w którym miejscu rysunek ma się znaleźć - ona u nas
się nie zmienia, jest stała to logiczne;
5 - współrzędna X;
6 - współrzędna Y;
7 - szerokość w rysunku docelowym;
8 - wysokość w rysunku docelowym;
9 - szerokość w rysunku źródłowym;
10 - wysokość w rysunku źródłowym;
4 ostatnie to parametry istotne do przeskalowania obrazów.
Następnie pojawia się nam funkcja imagedestroy - funkcja, która likwiduje identyfikator rysunku, jednocześnie zwalniając pamięć z nim związaną ( bo i po co on ma tam być :) ).
Po zakończeniu pętli - nasz utworzony obraz jest wyświetlany.
Dalej już mamy kod PHP - jak widać jeżeli nie wpisaliśmy żadnej liczby w formularzu - pojawia się nam on do wypełnienia, jeżeli wpisaliśmy jakąś liczbę ( większą od 0 ) wywoływana jest nasza napisana funkcja - drukujliczbe !
Wsio :)