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

Generowanie grafiki w PHP

Przykład 1: Captcha w PHP

Jak wiadomo człowiek łatwiej przyswaja wiedzę w oparciu o przykłady niż czytając samą teorię. Zaczniemy od napisania prostego skryptu generującego obrazek z tekstem (tzw. captcha) poznając przy okazji możliwości biblioteki. Aby nasze rozwiązanie było w miarę bezpieczne i jednocześnie czytelne dla osób które będą musiały z niego korzystać przyjmiemy pewne założenia:

  • Tłem dla tekstu będzie losowo wybrany obrazek
  • Na tło nałożymy kilka linii utrudniających nieznacznie odczytanie tekstu
  • Piszemy tekst
    • o losowej długości (od 4 do 6 znaków)
    • kilkoma krojami czcionek (3)
    • czcionką o losowej wielkości

Na początku przygotowałem 4 obrazki identycznych rozmiarów które stanowić będą tło naszych obrazków, prezentuję je poniżej:

Listing 1. Generowanie captcha w PHP

<?php
header('Content-Type: image/jpeg');

$tla           = glob("captcha_bcg/{*.jpg,*.jpeg}", GLOB_BRACE);
$czcionki      = glob("captcha_fonts/*.ttf");

$znaki         = 'ABCDEFGHIJKLMNPQRSTUWXYZ123456789';

$obrazek_tla   = $tla[array_rand($tla)];
$liczba_znakow = rand(4, 6);

$cap           = imagecreatefromjpeg($obrazek_tla);

$kolor         = imagecolorallocate($cap, 250, 250, 250);
$linie         = imagecolorallocate($cap, 205, 205, 205);

for($x = 1; $x <= 50; $x++)        // powtarzamy 50 razy - rysujemy 50 linii
 imageline(                        // funkcja rysująca linię
  $cap,                            // uchwyt obrazka
  0,                               // współrzędna X początku linii
  rand(-100,imagesy($cap)+100),    // współrzędna Y początku linii
  imagesx($cap),                   // współrzędna X końca linii
  rand(-100,imagesy($cap)+100),    // współrzędna Y końca linii
  $linie                           // kolor linii
 );

for($x = 1; $x <= $liczba_znakow; $x++)
{
 $czcionka = $czcionki[array_rand($czcionki)];
 $znak     = $znaki[rand(0, strlen($znaki)-1)];
	
 $odleglosc_miedzy_znakami = (round(imagesx($cap) / $liczba_znakow+1)-10)*($x-1)+20;
	
 imagettftext(                      // funkcja pisząca tekst
  $cap,                             // uchwyt obrazka
  rand(20, 30),                     // rozmiar czcionki
  rand(-15, 15),                    // naczylenie znaku
  $odleglosc_miedzy_znakami,        // odległość między znakami
  rand(40, 60),                     // położenie względem górnej krawędzi obrazka
  $kolor,
  $czcionka,
  $znak
 );
}

imagejpeg($cap);
?>

Listing 1. Omówienie kodu

Powyższy kod starałem się napisać w sposób czytelny, przez co może wydawać się on na pierwszy rzut oka dziwny, rzadko kiedy nadajemy każdy z parametrów funkcji w osobnych liniach, tak będzie jednak prościej opisać użyte funkcje.

Kod zaczynamy od przekazania odpowiedniego nagłówka header('Content-Type: image/jpeg');. Moglibyśmy oczywiście zrobić to później, w przypadku zwracania obrazka ważne jest aby wysłać go po prostu przed: imagejpeg($cap);

Nie ma sensu omawianie wszystkich funkcji których użyłem w kodzie, skupmy się na tych dostarczanych przez GD.

imagecreatefromjpeg()

Tworzy obrazek z pliku JPEG którego ścieżkę podajemy jako parametr. Gdybyśmy chcieli stworzyć obrazek z pliku innego typu możemy posłużyć się dającymi identyczny efekt funkcjami:

  • imagecreatefrompng() dla plików typu PNG
  • imagecreatefromgif() dla plików typu GIF
  • imagecreatefromwbmp() dla plików typu BMP
  • imagecreatefromgd() dla plików typu GD (starszy format)
  • imagecreatefromgd2() dla plików typu GD2 (nowszy format)
  • imagecreatefromstring() to funkcja na tyle ciekawa, że postanowiłem poświęcić jej więcej miejsca w artykule niż poprzednim. Jej działanie polega na utworzeniu obrazka ze zmiennej typu string czyli w zasadzie z tekstu. Użycie tej funkcji może okazać się bardzo zasadne kiedy np. chcemy operować na obrazku którego typu nie znamy, możemy wówczas posłużyć się następującym kodem kodem:
    <?php
    header('Content-Type: image/jpeg');
    $cap = imagecreatefromstring(file_get_contents('sciezka/do/pliku'));
    imagejpeg($cap);
    ?>
    Funkcja ta wspiera takie formaty graficzne jak: JPEG, PNG, GIF, WBMP, i GD2 o ile wspiera je nasza kompilacja PHP.
imagecreatetruecolor()

Funkcja ta pozwala utworzyć obrazek typu TrueColor o podanych wymiarach. Jako parametry przyjmuje:

  • $width szerokość
  • $height wysokość
imagecolorallocate()

Dodaje kolor do obrazka. Jako parametry przyjmuje:

  • $image uchwyt obrazka
  • $red, $green, $blue wartości kolorów składowych (od 0 do 255).
imageline()

Rysuje linię pomiędzy dwoma wyznaczonymi punktami. Jako parametry przyjmuje:

  • $image uchwyt obrazka
  • $x1 współrzędna x początku linii
  • $y1 współrzędna y początku linii
  • $x2 współrzędna x końca linii
  • $y2 współrzędna y końca linii
  • $color kolor (patrz: imagecolorallocate() )
imagettftext()

Pisze na obrazku tekst z użyciem czcionki true type. Jako parametry przyjmuje:

  • $image uchwyt obrazka
  • $size rozmiar czcionki
  • $angle kąt nachylenia, może przyjąć wartość ujemną
  • $x współrzędna x początku tekstu
  • $y współrzędna y początku tekstu
  • $color kolor (patrz: imagecolorallocate())
  • $fontfile plik czcionki
  • $text tekst który chcemy napisać
imagesx() i imagesy()

Zwracają szerokość i wysokość obrazka. Jako parametr przyjmuje:

  • $image uchwyt obrazka
imagejpeg()

Funkcja zwraca obrazek lub zapisuje go do pliku. Jako parametry przyjmuje:

  • $image uchwyt obrazka
  • $filename ścieżka do zapisu pliku, jeżeli chcesz zwrócić obrazek zamiast zapisywać go wpisz NULL
  • $quality jakość (od 0 - najgorsza do 100 - najlepsza)

Listing 1. Wynik działania kodu

Efekt na pewno dało by się poprawić, upiększyć, w każdym bądź razie przedstawia się następująco:

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (3)
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-2014 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System