RkBlog

Hardware, programming and astronomy tutorials and reviews.

Obróbka grafiki w PHP

Wykorzystanie biblioteki GD do obróbki i edycji plików graficznych z poziomu kodu PHP

GD czyli GraphicDraw to biblioteka wykorzystywana przez PHP do obróbki grafiki. Stosowana wcześniej biblioteka ImageMagick obecnie praktycznie nie jest już używana ze względu na mniejszą wydajność i mniejsze możliwości (w PHP), choć czynione są próby stworzenia nowego lepszego rozszerzenia.

Funkcja gd_info() zwraca tablicę zawierającą dane o bibliotece GD - wspieranych formatach itd:
Array
(
    [GD Version] => bundled (2.0.28 compatible)
    [FreeType Support] => 1
    [FreeType Linkage] => with freetype
    [T1Lib Support] => 1
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPG Support] => 1
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] => 1
    [XBM Support] => 1
    [JIS-mapped Japanese Font Support] => 
)
Funkcja getimagesize('ścieżka do pliku') zwróci tablicę z rozmiarem i typem pliku graficznego (GIF, JPG, PNG, SWF, SWC, PSD, TIFF, BMP, IFF, JP2, JPX, JB2, JPC, XBM), np:
Array
(
    [0] => 466
    [1] => 351
    [2] => 3
    [3] => width="466" height="351"
    [bits] => 8
    [mime] => image/png
)
By wyświetlić plik graficzny można skorzystać z prostego skryptu:
<?php
$size = getimagesize('nazwapliku');
$fp=fopen('nazwapliku', "rb");
if ($size && $fp) 
	{
	header("Content-type: {$size['mime']}");
	fpassthru($fp);
	exit;
	}
NOTKA: Gdy korzystamy z header("Content-type:... oznacza to że cała "strona" jest plikiem graficznym. Nie można dodawać HTML ani innych znaków. Nie można bezpośrednio wywołać takiego kodu na stronie HTML. Trzeba odwołać się do pliku z tym kodem poprzez IMG src="nazwa.php".
GD umożliwia też rysowanie-tworzenie plików graficznych.
imagearc( grafika_źródłowa, int cx, int cy, int w, int h, int s, int e, int kolor ) - rysuje okrąg (lub jego część) wycentrowany na cx, cy (góra lewo to 0,0). w i h to długość i wysokość. Początek i koniec (kąty) określane są przez argumenty s i e.
<?php
// twórz płótno 200x200
$img = imagecreatetruecolor(200, 200);
// biały i zielony
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 255, 0);
// robimy zielony okrąg
imagearc($img, 100, 100, 150, 150, 0, 360, $black);
// robimy mniejszy, półokrąg - 180 stopni
imagearc($img, 100, 100, 100, 100, 0, 180, $black);
// wyświetlamy
header("Content-type: image/png");
imagepng($img);
// czyścimy
imagedestroy($img);
imageellipse - tworzy elipsę, imagefilledellipse - tworzy wypełnioną elipsę, imagefilledarc - tworzy wypełnione koło, taki sam układ argumentów.

imagechar(grafika_źródłowa, int rozmiar_czcionki, int x, int y, string ZNAK, int kolor) - rysuje znak na grafice. Rozmiar czcionki od 1 do 5. imagecharup robi to samo tyle że rysuje znaki w pionie.
<?php
$im = imagecreatetruecolor(100, 100);
$string = 'A';
$bg = imagecolorallocate($im, 255, 255, 255);
$zielony = imagecolorallocate($im, 0, 255, 0);
imagechar($im, 5, 0, 0, $string, $zielony);
header('Content-type: image/png');
imagepng($im);

int imagecolorallocate ( grafika_źródłowa, int czerwony, int zielony, int niebieski ) - tworzy identyfikator koloru, który można wykorzystywać w innych funkcjach. Kolor określamy podając składowe RGB - czerwony/zielony/niebieski.

imagecreate ( int x_size, int y_size ) - zwraca identyfikator do pustego obrazu o rozmiarach x/y. Tworzymy obraz a następnie nanosimy tekst:
<?php
header("Content-type: image/png");
$im = @imagecreate(200, 50)
    or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 4, 5, 5,  "Lancuch :)", $text_color);
imagepng($im);
imagedestroy($im);
imagecreatefromgif, imagecreatefromjpeg, imagecreatefrompng('nazwa_pliku') - tworzy identyfikator obrazu z istniejącego pliku graficznego. Np. powyższy kod modyfikujemy trochę i otrzymujemy:
<?php
header("Content-type: image/png");
$im = @imagecreatefrompng('kot.png')
    or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 4, 5, 5,  "Lancuch :)", $text_color);
imagepng($im);
imagedestroy($im);
Uzyskamy tekst na istniejącym zdjęciu itp. imagedestroy(identyfikator obrazu) - czyści pamięć z identyfikatora.

imagerotate(identyfikator obrazu, kąt, kolor_tła) - obraca obraz o podany kąt.
<?php
// plik i rotacja
$filename = 'kot.png';
$degrees = 180;
// typ
header('Content-type: image/png');
// tworzymy identyfikator
$source = imagecreatefrompng($filename);
// obracamy
$rotate = imagerotate($source, $degrees, 0);
// wyświetlamy
imagepng($rotate);
GD posiada wiele funkcji, wszystkie opisane są w dokumentacji PHP pod "Image Functions".
RkBlog

14 July 2008;

Comment article