A PHP programozási nyelv

Képkezelés a GD könyvtárral

Bevezetés

A PHP segítségével nem csak HTML kimenetet generálhatunk. Használható a legkülönbözőbb képformátumok készítésére és manipulációjára is, többek között GIF, PNG, JPEG, WBMP és XPM formátumokkal dolgozhatunk. Sőt, ennél is többet tehetünk: streamként akár közvetlenül a böngészőbe irányíthatjuk a generált képeket.

Képek készítése, betöltése

Alapvetően két módja van a képek manipulációjának: meglévő kép betöltése fájlból, vagy új kép létrehozása.

Új képet az imagecreate( int $width , int $height ), illetve az imagecreatetruecolor( int $width , int $height ) függvényekkel hozhatunk létre. Ezek visszatérési értéke resource típusú, ezen keresztül fogjuk tudni manipulálni az elkészült ($width pixel széles és $height pixel magas) képet. Az új kép alapból üres, fekete színű.

Képet betölteni az imagecreatefrom[format]( string $filename ) függvényekkel lehet, ahol a forrás kép formátumától függően a [format] lehet gd2, gd2partr, gd, gif, jpeg, png, string, wbmp és xbmp. Ezek a függvények szintén resource típust adnak vissza, amennyiben sikerült a betöltés, és false-t, amennyiben nem.

Képek manipulációja

A legkülönfélébb alakzatokat rajzolhatjuk a fenti két módszer egyikével nyert képekre - a pixelek egyesével történő beállításától a téglalapokon, ellipsziseken és poligonokon át az ívekig. Az ezeket megvalósító függvényekben közös a paraméterezésük jellege: első paraméterük a kép resource, aztán az aktuális alakzat pozícióját, méretét, alakját befolyásoló adatok, és végül a szín, amivel az alakzat körberajzolásra vagy kitöltésre kerül. Minden ilyen függvény bool értéket ad vissza, ami true, ha sikerült az alakzat hozzáadása, és false, ha nem.

Színek megadása

A színek alapvetűen egyszerű int típussal reprezentálódnak, de van néhány dolog, amit érdemes és fontos tudni róluk. Meg lehet adni őket egyszerű hexadecimális literálként is, így pl.:

$white = 0x00FFFFFF; // ahol az első két karakter az alfa csatorna, aztán pedig a megszokott RGB hármas
$red = 0x00FF0000;

Ugyanakkor elképzelhető, hogy színpalettás képekkel szeretnénk dolgozni (GIF). Ekkor a kép palettájához az imagecolorallocate ( resource $image , int $red , int $green , int $blue ), vagy az imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha ) függvényekkel adhatunk hozzá maximum 255 darab színt. Ezen függvények $red, $green és $blue értelemszerűen a szín RGB értékei 0-tól 255-ig, az $alpha pedig az átlátszóság 0-tól 127-ig, ahol a 0 a teljesen látható, a 127 pedig a teljesen átlátszó.
Ha elértük a 255-ös paletta-korlátot, az imagecolordeallocate ( resource $image , int $color ) függvénnyel szabadíthatunk fel helyet.
Amennyiben a manipulált képet nem fájlból olvastuk be, hanem újonnan hoztuk létre, az imagecolorallocate és az imagecolorallocatealpha függvények első híváskor a megadott színűre festik a képet. Ez háttérszín megadására használható.

Alakzatok rajzolása

A következő bekezdésben egy rövid leírással felsorolom az alakzat kirajzoló függvényeket egy rövid leírással.

Minden, fent felsorolt függvénynek van egy filled párja, ami körvonal helyett kitöltést alkalmaz az utolsóban megadott paraméterének megfelelő színnel. Ezen függvények az imagefilledarc, imagefilledellipse, imagefilledpolygon, imagefilledrectangle, imagefilltoborder, paraméterezésük megegyezik a fentiekkel.

Ezen felül van lehetőségünk az MS Paintből jól ismert festékesvödör használatára: bool imagefill ( resource $image , int $x , int $y , int $color ) - az ($x, $y) pontokból kiindulva tölti ki a képet a $color színnel.

Szövegek rajzolása

Alapvetően két módja van a szövegek kiírásának, melyek a betűtípus kezelésében különböznek.

bool imagestring ( resource $image , int $font , int $x , int $y , string $string , int $color ):
Beépített, latin2 kódolású betűtípusok közül lehet választani, ha a $font paramétert 1-től 5-ig adjuk meg, illetve az imageloadfont függvénytől visszakapott, architektúrafüggő GDF betűtípusokat használhatjuk - ezek nem élsimítottak, használatuk nem ajánlott.

array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text ):
Tetszőleges TTF betűtípussal, méretben és szögben ír ki betűtípust, és visszaadja a befoglaló téglalapot (8 elemű tömb, 4 pont X és Y koordinátái, a pontok sorrendje: bal alsó, jobb alsó, jobb felső, bal felső). A szöget ($angle) szögben kell megadni, a 90 pl. fentről lefelé olvasandó döntött szöveget eredményez. Az élsimítás kikapcsolásához a szín negáltját kell megadni.

Szűrők

Jelenleg a tetszőleges módon elkészített képekre 12 előre gyártott szűrőt lehet alkamazni. Az eddig látott konvenciótól eltérően itt nem külön függvény tartozik mindegyik szűrőhöz, hanem csak egy:
bool imagefilter ( resource $image , int $filtertype [, int $arg1 [, int $arg2 [, int $arg3 [, int $arg4 ]]]] ).

Ebben a függvényben az első paraméter szokásos módon a képet takaró erőforrás, a második adja meg az alkalmazandó szűrő nevét, a többi paraméter megadása pedig az aktuális szűrőtől függ. A lehetséges szűrőnevek:

Ha sikerült a szűrő alkalmazása, true-t, ha nem, vagy rossz paraméterezést kapott, false-t ad vissza.

Kimenet

Különböző formátumú kimeneteket generálhatunk a szerkesztett képeinkből. Ezek kerülhetnek fájlba, és közvetlenül a HTTP válaszba is a kimeneti függvények és a HTTP fejléc függvényében.

A kimeneti függvények:

Böngészőbe streamelés

Ha a fenti függvényeknek elhagyjuk a $filename paraméterét, azok közvetlenül a kimenetre írják a képeket. Ekkor ügyelni kell arra, hogy a képtípusnak megfelelő HTTP fejlécet küldjük a böngészőnek: ezt pl. a header('Content-Type: image/png'); paranccsal tehetjük meg PNG kép esetén. Figyeljünk valamint arra is, hogy mást ilyen esetben ne írjunk ki, mert elronthatja a képet!

Ha ezek a feltételek teljesülnek, bátran beírhatjuk a képgeneráló PHP fájlunk URL-jét egy tetszőleges <img> tag src attribútumába, a böngésző teljesen átlagos képként fogja kezelni. Ezt a feladatot valósítja meg a TTF Text példaprogram, ami egy tetszőleges, paraméterben megadott szöveget a szintén paraméterben megadott mérettel fix méretre tördel, és egy TTF betűtípussal a kimenetre ír.