Biblioteka ta nadaje się również świetnie do generowania wszelkiego rodzaju graficznych wykresów reprezentujących dane pobrane bezpośrednio z PHP. Wygenerowane grafiki możemy następnie wyświetlać bezpośrednio do przeglądarki, albo zapisywać do plików. W artykule tym nauczymy się podstawowej zasady działania biblioteki i dowiemy się w jaki sposób wykorzystywać ją w kodzie.
1. Tworzymy pusty obrazek - imagecreatetruecolor()
Pierwszą podstawową rzeczą podczas pracy z GD2 jest stworzenie uchwytu do obrazka. Każda zabawa z GD2 rozpoczyna się od tego. Będziemy operować na pełnej palecie barw, więc nasz obrazek będziemy tworzyć za pomocą funkcji:
- $image = imagecreatetruecolor(szerokość_obrazka, wysokość_obrazka)
Jak widać za jedyne argumenty pobiera ona wysokość oraz szerokość generowanego przez nas obrazu. Stwórzmy nasz pierwszy obrazek:
- <?php
- $width = 400;
- $height = 300;
- $image = imagecreatetruecolor($width, $height);
- // stworzyliśmy pusty obrazek o szerokości 400px i wysokości 300px
- ?>
Obrazek nasz zapisaliśmy do zmiennej $image, na której to zmiennej będziemy następnie dokonywać wszystkich zwiazanych z nim operacji. Mamy więc pusty obrazek, który jednak narazie jest jedynie zasobem w pamięci operacyjnej serwera, nic tutaj narazie się nam jeszcze na ekranie nie wyświetli.
Na początek dodajmy mu trochę koloru, wypełnijmy go całego np. kolorem czerwonym.
Do stworzenia obrazu o zwykłej palecie barw służy natomiast funkcja:
- $image = imagecreate(szerokość_obrazka, wysokość_obrazka)
2. Definiujemy kolor - imagecollorallocate()
Wartość danego koloru musimy najpierw zdefiniować za pomocą funkcji:
- $color = imagecolorallocate($image, R, G, B)
gdzie jako pierwszy parametr podajemy uchwyt do utworzonego wcześniej obrazka, a następnie kolejno wartości RGB tworzonego koloru (z zakresu 0-255).
2.5. Definiujemy kolor z kanałem alpha - imagecollorallocatealpha()
Możemy także stworzyć kolor z wartością kanału alpha, a więc z przezroczystością, używamy do tego funkcji:
- $color = imagecolorallocatealpha($image, R, G, B, Alpha)
gdzie jako dodatkowy parametr podajemy wartość kanału alpha (z zakresu 0-127)
My chcemy stworzyć kolor czerwony, wywołamy więc funkcję z następującymi argumentami, przy czym zapiszemy sobie nasz kolor do zmiennej $red:
- <?php
- $width = 400;
- $height = 300;
- $image = imagecreatetruecolor($width, $height);
- // stworzyliśmy pusty obrazek o szerokości 400px i wysokości 300px
- $red = imagecolorallocate($image, 255, 0, 0);
- // zdefiniowaliśmy kolor czerwony i zapisaliśmy go do zmiennej $red
- ?>
3. Wypełniamy obrazek kolorem - imagefill()
Mamy już zdefiniowaną wartość koloru, czas aby wypełnić nasz obrazek tym właśnie kolorem, służy do tego funkcja:
- imagefill($image, $x, $y, $color)
gdzie jako pierwszy argument podajemy uchwyt do obrazka, następnie:
- $x - punkt początkowy w osi X od którego zaczynamy wypełnianie kolorem
- $y - punkt początkowy w osi Y od którego zaczynamy wypełnianie kolorem
- $color - wartość koloru wypełnienia utworzona uprzednio za pomocą imagecollorallocate()
My chcemy wypełnić cały obrazek, a więc cały obszar o wielkości 400x300px, jako początkowe współrzędne podamy więc wartości zerowe, a kolorem jakim wypełniamy będzie nasz czerwony:
- <?php
- $width = 400;
- $height = 300;
- $image = imagecreatetruecolor($width, $height);
- // stworzyliśmy pusty obrazek o szerokości 400px i wysokości 300px
- $red = imagecolorallocate($image, 255, 0, 0);
- // zdefiniowaliśmy kolor czerwony i zapisaliśmy go do zmiennej $red
- imagefill($image, 0, 0, $red);
- // wypełniliśmy obszar 400x300px naszego obrazka kolorem pobranym ze zmiennej $red
- ?>
4. Generujemy obrazek - imagepng(), imagejpeg(), imagegif()
Dla sprawdzenia wyniku wyświetlmy teraz obrazek bezpośrednio w przeglądarce.Służy do tego kilka funkcji, w zależności od tego jakiego typu obrazek chcemy wyrzucić na ekran:
- imagepng($image); - wyświetla nasz obrazek w formacie PNG
- imagejpeg($image); - wyświetla nasz obrazek w formacie JPEG
- imagebmp($image); - wyświetla nasz obrazek w formacie Windows BMP
- imagegif($image); - wyświetla nasz obrazek w formacie GIF
Aby jednak wyświetlić obrazek, musimy najpierw wysłać do przeglądarki nagłówek informujący o typie naszego obrazu. Dokonujemy tego za pomocą ustawienia odpowiedniego Mime-Type:
- PNG - image/png
- JPEG - image/jpeg
- BMP - image/bmp
- GIF - image/gif
Wyświetlmy nasz obrazek jako PNG:
- <?php
- $width = 400;
- $height = 300;
- $image = imagecreatetruecolor($width, $height);
- // stworzyliśmy pusty obrazek o szerokości 400px i wysokości 300px
- $red = imagecolorallocate($image, 255, 0, 0);
- // zdefiniowaliśmy kolor czerwony i zapisaliśmy go do zmiennej $red
- imagefill($image, 0, 0, $red);
- // wypełniliśmy obszar 400x300px naszego obrazka kolorem pobranym ze zmiennej $red
- header("Content-type: image/png");
- // definiujemy nagłówek z mimetype
- imagepng($image);
- // generujemy obrazek PNG
- imagedestroy($image);
- // zwalniamy uchwyt do obrazka
- ?>
W tym momencie powinien nam się wyświetlić piękny czerwony prostokąt o wymiarach 400x300px (wymiary na obrazku dodałem oddzielnie, wy zobaczycie jedynie czerwony prostokąt):
Pamiętajmy, że po wygenerowaniu grafiki zwalniamy zasób za pomocą:
- imagedestroy($image);
Warto też tutaj przyjrzeć się funkcji:
- imagefill()
Otóż - niezależnie jakie w tym momencie podamy koordynaty x i y, to obrazek zostanie wypełniony danym kolorem w całości.
5. Wypełniamy kolorem obszar - imagefilledrectangle()
Aby wypełnić jedynie zadany przez nas prostokątkny obszar, musimy skorzystać z funkcji:
- imagefilledrectangle($image, $x1, $y1, $x2, $y2, $red);
gdzie:
- $x1 - punkt początkowy na osi X
- $y1- punkt początkowy na osi Y
- $x2 - punkt końcowy na osi X
- $y2- punkt końcowy na osi Y
Wypełnijmy teraz więc jedynie jakąś część obrazka:
- <?php
- $width = 400;
- $height = 300;
- $image = imagecreatetruecolor($width, $height);
- // stworzyliśmy pusty obrazek o szerokości 400px i wysokości 300px
- $black = imagecolorallocate($image, 0, 0, 0);
- // zdefiniowaliśmy kolor czarny dla tła
- $red = imagecolorallocate($image, 255, 0, 0);
- // zdefiniowaliśmy kolor czerwony i zapisaliśmy go do zmiennej $red
- imagefill($image, 0, 0, $black);
- // wypełniliśmy obszar 400x300px naszego obrazka kolorem pobranym ze zmiennej $black
- imagefilledrectangle($image, 20, 20, 100, 120, $red);
- // wypełniliśmy obszar od 20-100px w poziomie i 20-120px w pionie
- header("Content-type: image/png");
- // definiujemy nagłówek z mimetype
- imagepng($image);
- // generujemy obrazek PNG
- imagedestroy($image);
- // zwalniamy uchwyt do obrazka
- ?>
Warto zauważyć, iż x2 i y2 nie oznaczają szerokości i wysokości wypełnienia lecz współrzędne na obrazku:
Współrzędne liczymy zawsze od lewego górnego rogu obrazka, który posiada współrzędną (0, 0).
6. Kanał alpha
Jak teraz utworzyć obrazek z kanałem alpha?Po pierwsze musimy zdefiniować nasz kolor z takim właśnie kanałem. Robimy to za pomocą funkcji:
- $color = imagecolorallocatealpha($image, R, G, B, Alpha)
gdzie kanał alpha może przyjąć wartości od 0 (całkowicie nieprzezroczysty) do 127 (całkowicie przezroczysty)
Stwórzmy więc nasz kolor czerwony, tak aby był w połowie przeźroczysty (wartość alpha - 64):
- <?php
- $width = 400;
- $height = 300;
- $image = imagecreatetruecolor($width, $height);
- // stworzyliśmy pusty obrazek o szerokości 400px i wysokości 300px
- $black = imagecolorallocate($image, 0, 0, 0);
- // zdefiniowaliśmy kolor czarny dla tła
- $red = imagecolorallocatealpha($image, 255, 0, 0, 64);
- // zdefiniowaliśmy kolor czerwony i zapisaliśmy go do zmiennej $red, tym razem z kanałem alpha
- imagefill($image, 0, 0, $black);
- // wypełniliśmy obszar 400x300px naszego obrazka kolorem pobranym ze zmiennej $black
- imagefilledrectangle($image, 20, 20, 100, 120, $red);
- // wypełniliśmy obszar od 20-100px w poziomie i 20-120px w pionie
- header("Content-type: image/png");
- // definiujemy nagłówek z mimetype
- imagepng($image);
- // generujemy obrazek PNG
- imagedestroy($image);
- // zwalniamy uchwyt do obrazka
- ?>
Wynik:
Jak widać, czerwony prostokąt troche nam przyciemniał, gdyż jest na wpół przezroczysty.
Cały obrazek jednak jako taki jest wciąż całkowicie nieprzeźroczysty. Jak teraz sprawić, aby nasz PNG jako całość uzyskał przezroczystość? Na logikę może się wydawać, że dałoby radę zrobić to za pomocą:
- $black = imagecolorallocatealpha($image, 0, 0, 0, 100);
dla tła.
To jednak nie pomoże. Zobaczmy:
Obrazek nie jest przezroczysty pomimo podania w kolorze tła kanału alpha.
7. Zapis kanału alpha - imagesavealpha()
Dlaczego nie udało się nam uzyskać przezroczystości dla całego obrazka?Ponieważ obrazek jako taki nie ma zapisanego w sobie kanału alpha, musimy to uczynić funkcją:
- imagesavealpha($image, true);
Nasz kod wyglądać więc będzie tak:
- <?php
- $width = 400;
- $height = 300;
- $image = imagecreatetruecolor($width, $height);
- // stworzyliśmy pusty obrazek o szerokości 400px i wysokości 300px
- $black = imagecolorallocatealpha($image, 0, 0, 0, 100);
- // zdefiniowaliśmy kolor czarny dla tła, z kanałem alpha = 100
- $red = imagecolorallocatealpha($image, 255, 0, 0, 64);
- // zdefiniowaliśmy kolor czerwony i zapisaliśmy go do zmiennej $red, z kanałem alpha = 64
- imagefill($image, 0, 0, $black);
- // wypełniliśmy obszar 400x300px naszego obrazka kolorem pobranym ze zmiennej $black
- imagefilledrectangle($image, 20, 20, 100, 120, $red);
- // wypełniliśmy obszar od 20-100px w poziomie i 20-120px w pionie
- header("Content-type: image/png");
- // definiujemy nagłówek z mimetype
- imagesavealpha($image, true);
- // zapisujemy kanał ALPHA w obrazku
- imagepng($image);
- // generujemy obrazek PNG
- imagedestroy($image);
- // zwalniamy uchwyt do obrazka
- ?>
Wynik:
Jak widać, tym razem obrazek wyświetli się nam w całości jako półprzezroczysty.
To tyle na początek, wiemy już mniej więcej jak działa bibioteka GD, w następnych artykułach poznamy następne jej funkcje i sposoby wykorzystania. W ramach ćwiczeń polecam poeksperymentowanie z udostępnionym tutaj kodem, zmieniając np. współrzędne i kolory, a następnie potestowanie wyników takich zmian.
Ciekawie opisane. Czekam na jeszcze więcej.
OdpowiedzUsuń