Programowanie w języku PHP

Tworzenie obrazków w PHP

  • 2013-03-17 17:32
  • 10 komentarzy
  • 10530 odsłon
  • Oceń ten tekst jako pierwszy
Tworzenie obrazków w php umożliwia moduł GD. Dzięki niemu możemy tworzyć grafikę w formacie GIF, JPEG i PNG.



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.


Rysowanie prostokątów i wielokątów


Aby narysowąć prostokąt potrzebna jest nam jedna z dwóch funkcji: ImageRectangle i ImageFilledRectangle. Pierwsza rysuje trójkat bez wypełnienia a druga z wypełnieniem. Funkcje te pobierają strumień GD, następnie współrzędne lewego-górnego i prawego-dolnego rogu i na końcu kolor. Przykład użycia:

<?php
header("Content-type: image/gif");
$obrazek = ImageCreateFromGif("obrazek.gif");
ImageRectangle($obrazek,10,10,60,50,$kolor);
ImageGif($obrazek);
ImageDestroy($obrazek);
?>

Rysowanie wielokątów jest bardzo podobne, mamy tu funkcje ImagePolygon i ImageFilledPolygon. Jednak argumenty tych funkcji nieco sie różnia od funkcji prostokątów. Pierwszy to strumień, drugi to tablica wierzchołków, trzeci liczba wierzchołków a czwarty kolor.

<?php
header("Content-type: image/gif");
$obrazek= ImageCreate(100,100);
$kolor = ImageColorAllocate($obrazek,0,0,0);
$wierzcholki = array (10,10,10,20,20,20);
ImageFilledPolygon = ($obrazek,$wierzcholki,3,$kolor);
ImageGif($obrazek);
ImageDestroy($obrazek);
?>



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

hyzyhassan 2015-11-23 12:24

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

Razer666 2012-12-28 09:50

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

pisak 2009-08-30 18:02

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

mi się to wyświetla  :(

bordeux 2007-08-16 09:54

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

Adikos 2007-07-19 13:46

Czemu tego nie da sie wstawic w kod HTML

<?
echo '<img border="0" src="';
header("Content-type: image/gif");
$imgname = 'http://x-themes.com/obrazek/themes.gif';
$im = 'http://x-themes.com/obrazek/obrazek.gif';
$obrazek_zrodlo = ImageCreateFromGif($imgname);
$obrazek = ImageCreateFromGif($im);
$x = imagesx($obrazek);
$y = imagesy($obrazek);
$szerokosc = $x - 90;
$wysokosc = $y - 30;
ImageCopy($obrazek, $obrazek_zrodlo, $szerokosc, $wysokosc,0,0,90,30);
ImageGif($obrazek);
ImageDestroy($obrazek);
ImageDestroy($obrazek_zrodlo);
echo 'width="800" height="600">';
?>

Moze mi to ktos wyjasnic??

eltrosto 2007-01-10 02:18

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

dragon1985 2006-09-14 12:45

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

wert120 2006-05-02 12:59

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

RX 2005-06-29 20:09

Niezły art, przyda się ;)

CooBek 2004-05-06 09:55

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