Tworzenie obrazków w PHP

Ziomal

Tworzenie obrazków w php umożliwia moduł GD. Dzięki niemu możemy tworzyć grafikę w formacie GIF, JPEG i PNG.

     1 Tworzenie obrazka
     2 Otwieranie obrazka
     3 Wypisywanie tekstu
     4 Sprawdzanie rozmiaru obrazka
     5 Sprawdzanie koloru określonej części i całkowitej liczby kolorów obrazka
     6 Kopiowanie jednego obrazka do drugiego
     7 Tworzenie obrazka z przeplotem
     8 Tworzenie przezroczystych obrazków

Tworzenie obrazka

<?php
header("Content-type: image/gif");
$obrazek = ImageCreate(80,40);
$kolor_tekstu = ImageColorAllocate($obrazek,0,0,0);
ImageString($obrazek,3,5,5,"tekst",$kolortekstu);
ImageGif($obrazek);
ImageDestroy($obrazek);
?>

Przykład ten powoduje wyświetlenie obrazka 80x40 pikseli z napisem tekst, ale wszystko od początku. W lini drugiej informujemy przeglądarke że to jest obrazek w formacie gif. Następna linijka tworzy strumień obrazka do manipulacji na innych funkcjach GD. Użyliśmy tu funkcji ImageCreate która jako argumenty przyjmuje szerokość (80) i wysokość (40) naszego obrazka. W lini 4 stworzylismy dwie zmienne i przypisaliśmy jej wartość zwracaną przez funkcje ImageColorAllocate. Jak pewnie zauważyliście jest to funkcja do definiowania koloru. Jako pierwszy argument podaje sie strumień GD a trzy następne to kolor w formacie RGB. Linia 5 powoduje wypisanie na naszym obrazku tekstu. Służy do tego funkcja ImageString. Więcej o niej dowiemy sie w dalszej części. Funkcja ImageGif konwertuje nasz obrazek do formatu gif i wysyła go do przeglądarki. Możemy tez utworzyc obrazek jpeg i png stosujac odpowiednio funkcji ImageJpeg i ImagePng. Musimy także w lini drugiej (informującą przeglądarke) zmienić format na wybrane przez nas.
Mozemy także nie wysyłać obrazka lecz zapisać go na dysku. Robimy to podobnie jak w naszym poprzednim przyładzie lecz usuwamy druga linijkę (mysle że z oczywistych powodów) i w funkcji ImageGif podajemy jako drugi argument nazwę pliku np. ImageGif($obrazek,"obrazek.gif").

Otwieranie obrazka

<?php
header("Content-type: image/gif");
$obrazek = ImageCreateFromGif("obrazek.gif");
ImageGif($obrazek);
ImageDestroy($obrazek);
?>

Zamiast tworzyc obrazek od początku mozemy odworzyć obrazek juz istniejacy. Do tego celu uzyliśmy funkcji ImageCreateFromGif (mozemy także uzyć ImageCreateFromJpeg i ImageCreateFromPng). Jak widać funkcja ta zwraza strumień GD. Przypisaliśmy go do zmiennej obrazek. Przed wyświetleniem tego obrazka możemy manipulować na nim tak jakbyśmy go utworzyli.

Wypisywanie tekstu

W pierwszym przykładzie tego artykułu użylismy już funkcji do wypisywania tekstu. Jest to ImageString. Jako pierwszy argument pobiera strumień GD, drugi argument to czcionka, trzeci i czwarty to położenie x i y względem obrazka, piąty to tekst do wypisania, a szósty to kolor.

<?php
header("Content-type: image/gif");
$obrazek = ImageCreate(80,40);
$czcionka = ImageLoadFont($czcionka.ft);
$kolor_tekstu = ImageColorAllocate($obrazek,0,0,0);
ImageString($obrazek,$czcionka,5,5,"tekst",$kolortekstu);
ImageGif($obrazek);
ImageDestroy($obrazek);
?>

Przykład ten jest bardzo podobny do naszego pierwszego przykladu jadnak uzylem tutaj funkcji ImageLoadFont. Służy ona jak sama nazwa wskazuje do załadowania czcionki którą można użyć do wypisania tekstu.
Istenieje funkcja bardzo podobna do ImageString jednak służy ona do wypisania tekstu w orientacji pionaowej. Jest to ImageStringUp. Jej argumenty są takie same jak dla funkcji ImageString. Obie funkcje służyły do wyświetlania całego łańcucha znaków, ale co zrobic gdy chcemy wyświetlić tylko jeden znak. Możemy skożystać z funkcji ImageString i ImageStringUp podając jako łańcuch znaków tylko jeden znak np.

<?php
header("Content-type: image/gif");
$obrazek = ImageCreate(80,40);
$czcionka = ImageLoadFont($czcionka.ft);
$kolor_tekstu = ImageColorAllocate($obrazek,0,0,0);
ImageString($obrazek,$czcionka,5,5,"s",$kolortekstu);
ImageGif($obrazek);
ImageDestroy($obrazek);
?>

Jednak php oferuje nam jeszcze dwie funkcje ImageChar i ImageCharUp właśnie do wyświetlania tylko jednogo znaku odpowiednio w orientacji poziomej i pionowej. Użycie tych funkcji jestidentyczne jak z ImageString i ImageStringUp.

Sprawdzanie rozmiaru obrazka

Gdy otworzyliśmy obrazek z dysku, nie znamy jego rozmiaru. Jednak możemy go poznać stosując funkcje GetImageSize(). Funkcja ta zwraca tabicę zawierającą szerokość, wysokość, format obrazka i gotowy do obsadzenia w html'u znacznik zawierający szerokość i wysokość a obrazek w jpeg dodatkowo liczbę kanałów.

<?php 
$dane_obrazka = GetImageSize("obrazek.jpg");
list($szerokosc,$wysokosc,$format,$znacznik_html,$kanaly) = $dane_obrazka;
print  "<img src=obrazek.jpg $znacznik_html>";
?>

Myślę, że wszystko się po tym przykładzie wyjaśniło. Dodam jeszcze że format obrazka jest to liczba dla której 1 to gif, 2 to jpg a 3 to png.

Sprawdzanie koloru określonej części i całkowitej liczby kolorów obrazka

Czasami zdarza się sytuacja kiedy chcemy pobrać kolor okreslonego piksela. Musimy wtedy pobrać index koloru za pomocą funkcji ImageColorAt a następnie jej wynik podać do funkcji ImageColorsForIndex która zwróci tablicę z kolorem czerwonym, zielonym i niebieskim. Poniższy przykład demonstruje użycie tych funkcji.

<?php
$obrazek = ImageCreateFromGif("obrazek.gif");
$index_koloru =ImageColorAt($obrazek,50,50);
$kolor_RGB = ImageColorsForIndex($obrazek, $index_koloru);
print $czerwony = $kolor_RGB['red'];
print $zielony = $kolor_RGB['green'];
print $niebieski = $kolor_RGB['blue'];
?>

Aby sprawdzić całkowitą liczbę kolorów musimy posłużyć się funkcją ImageColorsTotal.

<?php
$obrazek = ImageCreateFromGif("Obrazek.gif");
$liczba_kolorów = ImageColorsTotal($obrazek);
print ("Całkowiata liczba kolorów w obrazek.gif to:".$liczbakolorów);
?>

Kopiowanie jednego obrazka do drugiego

Php pozwala na skopiowanie część jednego obrazka do drugiego. Możemy tego dokonać funkcją ImageCopy. Pobiera ona wszystkie piksele z obrębu wskazanego prostokąta i nanosi go na drugi obrazek zaczynając od wskazanych współrzędnych. Przedstawie to na przykladzie.

<?php
$obrazek_zrodlo = ImageCreateFromGif("obrazekzrodlo.gif");
$obrazek = ImageCreateFromGif("obrazek.gif");
ImageCopy($obrazek_zrodlo, $obrazek, 10,15,20,30,100,50);
ImageGif($obrazek,"nowyobrazek.gif");
ImageDestroy($obrazek);
ImageDestroy($obrazek_zrodlo);
?>

Wszystko w tym przykładzie powinno być jasne poza linijką 4. Jest tam bowiem nasza funkcja ImageCopy. Otóż pierwszym argumentem jest strumień GD obrazkia z którego chcemy kopiować (w naszym przykładzie $obrazek_zrodlo), a w drugim obrazek do którego chcemy kopiować. Dalej mamy dwie współrzędne określające w jakim miejscu na naszym obrazku docelowym ma być wklejony fragment. Oczywiście jest to współrzędna lewego górnego rogu. Następnie są współrzędne określające skąd ma zacząć się kopiowanie, szerokość i wysokość kopiowanego fragmentu,

Tworzenie obrazka z przeplotem

Obrazek z przeplotem jest to obrazek który ładuje się w kilku etapach. Dzięki temu taki obrazek widac już zanim się cały załaduje. Php oczywiście umożliwia nam utworzenie takiego efektu. Służy do tego funkcja ImageInterlace(). Pobiera ona strumień Gd a drugi parametr musi byc jeden co oznacza że obrazek jest z przeplotem.

<?php
header("Content-type: image/gif");
$obrazek = ImageCreate(80,40);
ImageInterlace($obrazek,1);
$czcionka = ImageLoadFont($czcionka.ft);
$kolor_tekstu = ImageColorAllocate($obrazek,0,0,0);
ImageString($obrazek,$czcionka,5,5,"tekst",$kolortekstu);
ImageGif($obrazek);
ImageDestroy($obrazek);
?>

Tworzenie przezroczystych obrazków

Przezroczysty obrazek polega na tym, że piksele które zostały pomalowane kolorem ustawionym jako przezroczysty będą zmieniały się w zależności od tego na jakim tle sie znajdują. Do tego celu służy funkcja ImageColorTransparent.

<?php
header("Content-type: image/gif");
$obrazek = ImageCreate(80,40);
$kolor_tekstu = ImageColorAllocate($obrazek,0,0,0);
$kolor_tla = ImageColorAllocate($obrazek,0,0,0);
$kolor_tla_przezroczysty = ImageColorTransparent($obrazek, $kolor_tla);
ImageString($obrazek,3,5,5,"tekst",$kolortekstu);
ImageGif($obrazek);
ImageDestroy($obrazek);
?>

10 komentarzy

fajny artykuł dający "pigułkowe" wiadomości jak zacząć się bawić obrazkami, szczerze to miło czasem sobie
poczytać takie coś, dzieki autorze.
Ja używałam funkcji getimagesize() z strrchr() i imagecreatefrom*() także do rozpoznawania czy obrazek jest faktycznie tym za co się podaje...

Nie wiem czy wolno ale tak wrzucę moją starą kapcię ze skośnymi literkami.

session_start();//przyda się :)
$imgs_list = glob(".somethin/cptch*.jpg");
$font_list = glob("somethin/*.ttf");
$chars_list = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUWXYZ123456789!?&,;+=" ;
$listlen = strlen($chars_list) - 1;
$captcha_img = imagecreatefromjpeg($imgs_list[array_rand($imgs_list)]);
$captcha_color0 = imagecolorallocate($captcha_img, 255, 0, 0); //red
$captcha_color1 = imagecolorallocate($captcha_img, 0, 0, 0); //black
$captcha_color2 = imagecolorallocate($captcha_img, 33, 33, 33);//dark grey
$captcha_color3 = imagecolorallocate($captcha_img, 255, 77, 77); //bitchy violet
$captcha_color4 = imagecolorallocate($captcha_img, 99, 99, 99); //bitchy violet
$captcha_palette_colors = array();
array_push($captcha_palette_colors, $captcha_color0, $captcha_color1, $captcha_color2);
//$captcha_font = "./".$font_list[array_rand($font_list)];
$captcha_font = $font_list[array_rand($font_list)];
$letters = "";
for($iter = 0; $iter<=15; $iter++)
{
imageline($captcha_img, 0, rand(0,40), 160, rand(0, 40), $captcha_color4);
}
for($i=1; $i<=6; $i++)
{
if ($i > 1)
{
$dst = ($i-1)*25 + 4;
}
elseif($i = 1)
{
$dst = 4;
}
$letter = $chars_list{rand(0, $listlen)};
$letters .= $letter;
//$rand_color = rand(0, 3);
imagettftext(
$captcha_img,
26.0,
rand(0, 10),
$dst,
38,
$captcha_palette_colors[array_rand($captcha_palette_colors)],
$captcha_font,
$letter
);
}
$_SESSION['captcha_code'] = $letters;
header("Content-Type: image/jpg");
imagejpeg($captcha_img) ;
imagedestroy($captcha_img);

Spoko, mi też się przyda. Będę trochę dłubał z tym w ten weekend.

Parse error: parse error, unexpected '=', expecting ')' in D:\usr\www\index.php on line 3

mi się to wyświetla :(

Adikos :Gdyż wysyłasz headera ze to jest plik gif a nie html!!

Czemu tego nie da sie wstawic w kod HTML

<? echo ''; header('; ?>

Moze mi to ktos wyjasnic??

a mi to nie dziala w firefoxie :/ w ie jest ok, wie ktos dlaczego ?

A ja się przyczepie. transparencja mi nie działa.

No i może jeszcze to: "odworzyć" (zaraz na początku tekstu ;D). Nie wiem, może to miało być otworzyć lub odtworzyć. Najprędzej zwykła literówka, ale śmiesznie wygląda. :P

Niezły art, przyda się ;)

nono.. dobry art, prawie nie ma sie do czego przyczepic, poza kolorowaniem skladni php ;-)