Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!
Wyszukiwarka

Wyszukiwarka

Aby odnaleźć interesujące Cię informacje wpisz poniżej szukane frazy:
Logowanie

Logowanie

Zaloguj się aby zobaczyć swój profil:

Generowanie grafiki w PHP

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.

Zastosowania bibliotek graficznych

Biblioteki graficzne mają bardzo wiele zastosowań, najczęściej jednak można spotkać się z ich użyciem przy okazji:

  • Zabezpieczania formularzy (tzw. captcha)
  • Zmiany rozmiarów obrazków
  • Zabezpieczania zdjęć znakiem wodnym
  • Generowania wykresów
  • Nakładanie filtrów na obrazki
  • Obracania obrazków

Zanim zaczniemy pracę

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ę.

Podstawy

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.

Nagłówki

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.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie uzytkowników: (5)
Błłedy w prezentowanym kodzie lub niepełny kod
Środa 04 Grudzień 2024 1:39:38 pm - Solonoseb <lwaldi_at_poczta.fm>

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);
?>

3cia część artykułu. Błędy
Wtorek 16 Grudzień 2014 4:16:36 pm - zoorg <qkenkenu_at_wp.pl>

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...

porównanie bibliotek
Wtorek 22 Luty 2011 5:15:46 pm - siutek <siutek_at_gmail.com>

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.

problem z wykresem
Poniedziałek 03 Styczeń 2011 7:17:11 pm - kroolic

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

Przykład 3. Generowanie wykresów w PHP
Poniedziałek 03 Styczeń 2011 5:01:00 pm - kroolic <kroolic_at_op.pl>

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ę.

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2025 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System