Język PHP sam w sobie nie pozwala na tworzenie czy manipulowanie grafiką, służą do tego specjalne biblioteki dostarczające zestaw odpowiednich funkcji. Najpopularniejsze z nich to GD i ImageMagick, przy czym ta pierwsza jest częściej dostępna i bardziej popularna, przez co w sieci na jej temat znaleźć można więcej materiałów. Nie są to oczywiście argumenty przemawiające za korzystaniem wyłącznie z tego rozwiązania, w tym artykule jednak skupimy się właśnie na GD i funkcjach przez nią dostarczanych. Zacznijmy może od krótkiego przedstawienia biblioteki - poniższy opis to definicja GD przedstawiana na Wikipedii:
I to w zasadzie tyle, jeżeli kogoś interesuje krótka historia biblioteki zachęcam do zapoznania się z jej anglojęzycznym opisem.
Biblioteki graficzne mają bardzo wiele zastosowań, najczęściej jednak można spotkać się z ich użyciem przy okazji:
Przed rozpoczęciem pracy z GD musimy upewnić się co do jej dostępności. Jeżeli korzystamy z PHP w wersji 5.2.4 lub nowszego aby to sprawdzić posłużymy się STAŁĄ PREDEFINIOWANĄ dostępną w przypadku kiedy rozszerzenie jest włączone:
<?php echo GD_VERSION; ?>
Zwrócenie przez powyższy kod tekstu "GD_VERSION" oznacza, że biblioteka GD jest niedostępna. Jeżeli jest zainstalowana powinniśmy otrzymać numer jej wersji.
Osoby korzystające z PHP w wersji starszej niż 5.2.4 mogą posłużyć się poniższym kodem w celu sprawdzenia dostępności biblioteki:
<?php echo 'Biblioteka GD jest '.(extension_loaded('gd') ? 'dostępna' : 'niedostępna'); ?>
Kiedy już sprawdzimy czy biblioteka jest dostępna warto sprawdzić jej konfigurację, posłuży nam do tego funkcja gd_info() zwracająca tablicę zawierającą informacje dotyczące biblioteki GD.
<?php echo '<pre>'; var_dump(gd_info()); ?>
Powyższy kod w moim przypadku zwraca tak przedstawiającą się tablicę:
array(12) { ["GD Version"]=> string(27) "bundled (2.0.34 compatible)" ["FreeType Support"]=> bool(true) ["FreeType Linkage"]=> string(13) "with freetype" ["T1Lib Support"]=> bool(true) ["GIF Read Support"]=> bool(true) ["GIF Create Support"]=> bool(true) ["JPG Support"]=> bool(true) ["PNG Support"]=> bool(true) ["WBMP Support"]=> bool(true) ["XPM Support"]=> bool(false) ["XBM Support"]=> bool(true) ["JIS-mapped Japanese Font Support"]=> bool(false) }
Mamy czarno na białym napisane jakie formaty wspiera a jakich nie nasza biblioteka, oraz znamy jej wersję.
Musimy przede wszystkim wiedzieć, że GD przechowuje obraz z którym pracujemy w zmiennej typu GD przez co możliwe jest wczytanie obrazu dowolnego typu i zwrócenie go w dowolnej, obsługiwanej przez bibliotekę postaci. Możemy więc wczytać obrazek typu GIF i zwrócić go jako PNG tak jak przedstawia to kod zamieszczony poniżej:
<?php $im = imagecreatefromgif('obrazek.gif'); imagepng($im); ?>
Biblioteka GD pozwala ponadto na zapis pliku na dysku z użyciem tych samych funkcji:
<?php $im = imagecreatefromgif("obrazek.gif"); imagejpeg($im, 'obrazek.jpg', 100); ?>
Trzeci, opcjonalny parametr służy do określenia jakości pliku wynikowego i musi być liczbą z przedziału 0-100 dla pliku typu JPEG lub 0-9 dla plików typu PNG, im niższa jakość tym mniejszy rozmiar pliku wynikowego. Jeżeli jako drugi parametr przekażemy wartość NULL plik zostanie przekazany do przeglądarki w określonej jakości bez jego zapisu.
W zależności od tego jakiego typu obrazek zwracamy do przeglądarki lub zapisujemy na dysku musimy wysłać odpowiedni nagłówek, o tym jak powinny one wyglądać w zależności od typu pliku dowiesz się z poniższej tabelki:
Typ pliku: |
JPG/JPEG |
PNG |
GIF |
BMP |
---|---|---|---|---|
Content-type: |
image/jpeg |
image/png |
image/gif |
image/bmp |
Nagłówek należy wysłać przed wysłaniem czegokolwiek innego do przeglądarki używając następującej funkcji: header('Content-Type: CONTENT-TYPE'); zamieniając CONTENT-TYPE na jeden z zamieszczonych w tabelce.
Strona generuje błąd, ponieważ w kodzie jest zamieszczone:
function gen_wykres($dane, $width = 500, $height = 250, $dist = 10, $tlo = 'grad.jpg', $font = 'verdana.ttf')
jeżeli ktoś nie ma w katalogu strony: obrazu grad.jpg i fontu verdana.ttf
błąd będzie się zawsze pojawiał.
Obraz jest wykorzystywany w procedurze generowania tła:
$bcg_image = imagecreatefromjpeg($tlo);
Można to pominąć, ale trzeba dograć lub wskazać lokalizację fontu:
(np.: cp /usr/share/fonts/truetype/freefont/FreeSerif.ttf /Twoja lokalizacja strony/)
Tak wygląda poprawiony cały kod strony (jako przykład):
<?php
function gen_wykres($dane, $width = 500, $height = 250, $dist = 10)
{
$wykres = imagecreatetruecolor($width, $height);
$backgroundColor = imagecolorallocate($wykres, 255, 255, 255);
$font = getcwd() . '/FreeSerif.ttf'; // ten font jest wgrany do katalogu strony z lokalizacji
$fontSize = 10;
imagefill($wykres, 0, 0, $backgroundColor);
$count_all = array_sum($dane);
$max = max($dane);
$el_width = round(($width - $dist) / count($dane));
$mnoznik = ($height - ($dist * 2)) / $max;
foreach ($dane as $key => $value)
{
$col = round(255 - (150 / count($dane)) * $i);
$colors[$key] = imagecolorallocate($wykres, $col, 200, 0);
$text_color[$key] = imagecolorallocate($wykres, 0, 0, 0);
$top = $height - ($dist) - $value * $mnoznik;
$left = $i * $el_width + $dist;
imagefilledrectangle($wykres, $left, $top, $left + $el_width - $dist, $height - $dist, $colors[$key]);
imagettftext($wykres, 10, 90, $left + $el_width / 2, $height - $dist - 2, $text_color[$key], $font, $key.' - '.round($value * 100 / $count_all, 2).' %');
$i++;
}
return $wykres;
}
header('Content-Type: image/png');
$dane['Styczen'] = 5000;
$dane['Luty'] = 6000;
$dane['Marzec'] = 9000;
$dane['Kwiecien'] = 8500;
$dane['Maj'] = 8000;
$dane['Czerwiec'] = 7500;
$dane['Lipiec'] = 7100;
$dane['Sierpien'] = 6800;
$dane['Wrzesien'] = 6100;
$dane['Pazdziernik'] = 7800;
$dane['Listopad'] = 8200;
$dane['Grudzien'] = 7600;
$wykres = gen_wykres($dane);
imagepng($wykres);
?>
http://php.pl/phppl/Wortal/Artykuly/PHP/Biblioteki/Generowanie-grafiki-w-PHP/Przyklad-3.-Generowanie-wykresow-w-PHP
artykuł fajny, ale jak z większością artów zawartych na tej stronie, wiecznie "COŚ" nie działa.
próbowałem wygenerować wykres dla pliku ANSI, UTF-8, z BOM-em i bez BOM-a...
Poproszę dodać rozdział JAK POPRAWNIE skonfigurować plik w którym zapisujemy opisywany przykład kodu...
Bedzie moze jakis artykul w niedalekiej przyszlosci na temat biblioteki ImageMagic?? uzywam obecnie GD, ale slyszalem sporo opinii że IM jest szybsza. Chcialbym poznac wady i zalety obu.
już sobie poradziłem, okazało się że gdy miałem w .htaccess ustawione php_value display_errors 1 , to wtedy pokazuje informacje
Obrazek "http://www.adreswww.pl/wykres.php" nie może zostać wyświetlony, ponieważ zawiera błędy.
ustawienie php_value display_errors 0 , pokazuje wykres, nigdy bym na to nie wpadł, przez przypadek na to trafiłem, pozdrawiam
Kod i artykuł przejrzysty, tego szukałem, tylko jeden problem z artykułem "Przykład 3. Generowanie wykresów w PHP" - chodzi o to że autor nie podał jak ma wyglądać grafika użyta do wykresów i przeglądarka wyrzuca błąd
Obrazek "http://www.strona.pl/kod.php" nie może zostać wyświetlony, ponieważ zawiera błędy.
dziwny błąd, kod na żywca skopiowany z artykułu. Jeśli to możliwe proszę o uzupełnienie artykułu. Dziękuję.