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 :)