9.20 Grafika

A PHP-ban a grafikai modult nem a képek egyszerű kitételére használhatjuk, hanem a szerver oldalon képekkel végzett manipulációkra. A PHP grafikához szükséges, hogy a szerver oldalon be legyen töltve a php_gd modul vagy az imagemagick modul.

A két modul eltérően működik. Az Imagick kicsit többet tud és kicsit másképpen kell programozni. A GD grafika inkább a hagyományos procedurális programozást támogatja, míg az Imagick az OOP-t támogatja.

A GD modul a PHP többi részével együtt folyamatosan fejlődik. Jelenleg az alábbi fájltípusokat tudja kezelni.

  • GIF - olvasás, írás (legfeljebb 256 szín)
  • JPEG - olvasás, írás (veszteséges tömörítés)
  • PNG - olvasás, írás (Specialitás, hoghy nem veszteséges a tömörítés és a kép lehet áttetsző)
  • WBMP - olvasás, írás (régebbi mobiltelefonok által használt képtípus)
  • XBM - olvasás, írás (x-windows rendszerek képformátuma)
  • WebP - olvasás, írás (Google által használt képformátum. Hasonló minőséggel kisebb fájlméret érhető el, mint a JPEG esetén. A képek lehetnek áttetszőek, mnt a PNG esetén.)

Az alábbiakban a GD esetén leggyakrabban használt függvényeket, a leggyakrabb használati módokat tárgyaljuk.A FreeType library használatával különböző betűtípusokat lehet használni.

gd_info() - a GD library tulajdonságainak kiiratása

getimagesize ( string $filename , array &$image_info = null ) : array|false - Egy fájlban lévő képek mérete. Az első paraméter a fájl elérési útvonala fájlnévvel a végén. Második paraméterként egy üres tömböt adhatunk át, amibe tömbbe visszakapjuk az un. exif információkat. Visszatérési értékként hét elemű tömöbt kapunk vissza, aminek a 0. és 1. eleme az X, második az y méret. a többi egyéb információ. Ha nem képfájl, akkor false értéket ad vissza.

Kép létrehozása

getimagesizefromstring ( string $string , array &$image_info = null ) : array|false - egy stringbe korábban beolvasott fájl adatiból ugyanazokat a paramétereket adja vissza, mint a getimagesize(). A különbség az, hogy az első paraméter a képfájlt tartalmazó string.

A képekkel való művelet során a memóriában létrejön a képhez tartozó erőforrás, amelyet egy resource típusú változó tárol. A kép méretétől függően ez több-kevesebb memóriát foglal, ezért fontos, hogy a képmanipulálás befejeztével ez az erőforrás felszabaduljon. A legcélszerűbb az, hogy minden képmanipuláló utasítást függvény belsejében, vagy objektum belsejében hajtsuk végre, mivel az eljárásból való kilépéskor a lokális változó automatikusan megszűnik és felszabadul a memória.

imagecreate ( int $width , int $height ) : resource - a megadott méretekkel létrejön egy kép a memóriában. A resource típusú változó tartalmazza a képet. A kép színpaletta alapú, vagyis 256 színt tartalmazhat csak!

imagecreatetruecolor ( int $width , int $height ) : resource - True color színű, fekete képet hoz létre.
 
Az alábbi függvények a függvény nevében jelzett, háttértáron lévő fájlból készítenek a memóriában egy-egy kép erőforrást, amelyekkel aztán a továbbiakban lehet a képmanipulációkat végezni. A paraméter minden esetben a szerveren található fájlnév elérési útvonallal, a visszaadott erőforrás változó ugyanaz, mint korábbna.
 
imagecreatefromgif ( string $filename ) : resource
imagecreatefromjpeg ( string $filename ) : resource
imagecreatefrompng ( string $filename ) : resource
imagecreatefrombmp ( string $filename ) : resource
imagecreatefromwebp ( string $filename ) : resource
imagecreatefromxbm ( string $filename ) : resource
imagecreatefromxpm ( string $filename ) : resource
 
Az alábbi függvény az engedélyezett fájltípusok (gif, jpeg, png, stb...) string alakban betöltött képadataiból készít kép erőforrást.
imagecreatefromstring ( string $image ) : resource

A memóriába töltött kép erőforráshoz színeket rendelhetünk hozzá:

imagecolorallocate ( resource $image , int $red , int $green , int $blue ) : int - A megadott képerőforráshoz a vörös, zöld és kék komponensekből állíthatunk elő egy színt és azt lementhetjük egy változóba, amely a megadott színt reprezentálja. Ezzel a változóval tudunk különböző műveleteket végezni a képen a memóriában. Az RGB komponensek értéke 0..255 között lehet. Ha nem lehet előállítani a színt, akkor a visszatérési érték false lesz, ami összekeverhető a 0 értékkel, ezért ha hibaellenőrzésre van szükség, akkor az azonosan egyenlő: === ellenőrzést érdemes használni.

Ha egy képet betöltöttünk a memóriába, akkor a különböző képmanipuláló műveletek után kimenthetjük egy fájlba a szerver vagy kiküldhetjük a böngészőnek.

imagejpeg ( resource $image , mixed $to = null , int $quality = -1 ) : bool - kiküld egy jpeg fájlt a háttértárra vagy a böngészőnek a kimenetre. Ha a $to paraméter nincs megadva vagy üres, akkor a böngészőnek küldi, ha egy elérési útvonal és fájlnév van, akkor lementi a szerveren. A $quality paraméter 0..100% közötti egész szám és a tömörítés mértékét jelenti. A nagyobb százalék jobb minőséget, de nagyobb fájlt eredményez. Az alapértelmezett érték 75% körüli és az érték -1. A visszaadott logikai érték a kiküldés sikerességét jelenti.

imagepng ( resource $image , mixed $to = null , int $quality = -1 , int $filters = -1 ) : bool -  kiküld egy png fájlt a kimenetre vagy a szerver fájlrendszerébe. A $quality paraméter a zlib tömörítéstminőségét jelöli, 0 - tömörítetlen, 9 a maximális tömörítés. A $filter paraméter a PNG fájlok filterezését jelöli. részletesebb leírás a dokumentációban. A PNG fájlok mérete általában legalább kétszer akkora, mint a hasonló tartalmú jpeg fájlok mérete.
 
imagegif ( resource $image , mixed $to = null ) : bool - Egy gif fájlt állít elő vagy küld ki a böngészőnek. A GIF fájlok legfeljebb 256 színűek lehetnek!
 
imagewbmp ( resource $image , mixed $to = null , ]int $foreground] ) : bool - WBMP típusú kimenetet hoz létre. A $foreground paramétera korábban imagecolorallocate() fügvénnyel létrehozott  színt jelenti, ami az előtér színe lesz. Minden más szín háttér szín.
 
imagewebp ( resource $image , mixed $to = null , int $quality = 80 ) : bool - WebP típusú képet hoz létre. A $quality paraméter a tömörítés mértékét jelöli. 0 a legkisebb fájl és legrosszabb minőség, 100 a legnagyobb fájl és legjobb minőség.
 
imagexbm ( resource $image , mixed $filename , [int $foreground] ) : bool - Hasonlóan a wbmp esethez itt is lehet átlátszó színt adni.
 
imagedestroy ( resource $image ) : bool - felszabadítja a képet tartalmazó memóriaterületet, amit az imagecreate vagy imagecreatetruecolor fügvénnyel hoztunk létre. A paramétere a képet jelképező erőforrás változó.

Képek manipulációja

Többféle manipulációt lehet használni. A leggyakrabbak:

  • Kép geometriájának változtatása: átméretezése, részlet kivágása, elforgatás, tükrözés,  kép kiterjeszétse
  • Színekkel való manipuláció: fehéregyensúly, kontraszt módosítása, szín telítettsége
  • Élesség, homályosítás - erre nincsen beépített lehetőség a GD-ben.
  • Rajzolás, írás a képre.

Kép geometriájának változtatása

imagecrop ( resource $image , array $rect ) : resource|false - Levágja a képet. $rect - 4 elemű tömb, amelyben a vágás helye és méretei vannak: x, y, koordináták, szélesség magasság. Minden adat pixelben van megadva. A visszatérési érték vagy egy új (vagy ugyanaz az) image változó, vagy pedig false, hogyha hiba csúszott a műveletbe.
 
imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h ) : bool - Az eredeti kép egy részét kiveszi és átméretezi.
  • $src_image - az eredeti kép, $src_x, $src_y, $src_w, $src_h - a forrás képből annak a területnek a leírása, ahonnak kiveszi a képadatokat (x, x, szélesség, magasság)
  • $dst_image - az eredmény kép, $dst_x, $st_y, $dst_w, $_dst_h az eredmény képbe behelyezi a forrás terület adatait.

Ennek használata során a forrás kép a teljes képet jelöli, létrehozunk egy másik képet, (amely mondjuk kisebb, mint a régi), és abba bemásoljuk a képi információt.

imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h ) : bool - Hasonló, mint az előző függvény, de a kép adatokat újraszámolja a PHP.
 
imagescale ( resource $image , int $new_width , int $new_height = -1 , int $mode = IMG_BILINEAR_FIXED ) : resource|false - Átméretez egy képet a megadott szélességre és magasságra.
 
imagerotate ( resource $image , float $angle , int $bgd_color , bool $ignore_transparent = false ) : resource|false - Megadott szöggel elforgatja a képet. $angle - fokban megadva, $bgd_color - az a kitöltőszín, amivel az elforgatott kép hátterét kitölti.
 
imageflip ( resource $image , int $mode ) : bool - Egy kép tükrözése. A $mode paraméter az alábbi lehet:
  • IMG_FLIP_HORIZONTAL - vízszintes tükrözés.
  • IMG_FLIP_VERTICAL - függőleges tükrözés
  • IMG_FLIP_BOTH  - mind a két irányú tükrözés

Írás, rajzolás egy képre

Írás, rajzolás során mindig egy imagecreatetruecolor() függvénnyel létrehozott színnel írhatunk a képre.
 
imagesetpixel ( resource $image , int $x , int $y , int $color ) : bool - Egy képpont kirajzolása a megadott koordinátákba, a megadott színnel.
 
imagesetbrush ( resource $image , resource $brush ) : bool - a képhez hozzárendel egy ecsetet, amelyet az imageline és image polygon utasítások használhatnak.
 
imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) : bool - A megadott kezdő és végpontok közé a megadott színnel rajzol egy vonalat.
 
imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) : bool - rajzol egy téglalapot a megadott koordináták jelentik a téglalap ellentétes csúcsait.
 
imagepolygon ( resource $image , array $points , int $num_points , int $color ) : bool - Rjazol egy zárt sokszöget. A $points tömb tartalmazza, a poligon csúcsainak a koordinátáit olyan módon, hogy $points[0] => x0, $points[1] => y0, $points[2] => x1, $points[3] => y1, stb... A $num_polints jelenti a pontok számát, amely a points tömb méretének a fele, minimum 3.
 
imageopenpolygon ( resource $image , array $points , int $num_points , int $color ) : bool - Ugyanaz, mint fent csak nyitott sokszöget rajzol ki.
 
imageellipse ( resource $image , int $cx , int $cy , int $width , int $height , int $color ) : bool - Megadott középponttal, megadott szélességű és magasságú ellipszist rajzol. Ha a szélesség és a magasság egyenlő, akkor kört rajzol.
 
imagearc ( resource $image , int $cx , int $cy , int $width , int $height , int $start , int $end , int $color ) : bool - Körívet rajzol a megadott középponttal, szélességgel és magassággal, kezdő és végső szöggel és színnel. A szög fokokban van megadva.
 
Amikor színnel kitöltött alakzatot rajzolunk, akkor általában az eredeti parancsot kell kiegészíteni egy filled szóval.
 
imagefill ( resource $image , int $x , int $y , int $color ) : bool - egy kép megadott pontjából kezdve kitölti a megadott színnel a képet.
 
imagefilltoborder ( resource $image , int $x , int $y , int $border , int $color ) : bool - kitölt egy képet a megadott ponttól kezdve a $border színnel megadott határvonalig. Ha a $border szín nyitott, akkor a kitöltés "kifolyik" a határvonalból.
 
imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) : bool
 
imagefilledpolygon ( resource $image , array $points , int $num_points , int $color ) : bool
 
imagefilledellipse ( resource $image , int $cx , int $cy , int $width , int $height , int $color ) : bool
 
imagefilledarc ( resource $image , int $cx , int $cy , int $width , int $height , int $start , int $end , int $color , int $style ) : bool

Írás egy képre

Az írás során be kell tölteni egy fontot, majd a megadott helyre és méretben a megadott szöveggel és színnel kiírhatjuk a szöveget a képre. A szöveg kiiratása a képre meglehetősen lassú folyamat, ezért lehetőleg ritkán használjuk!
 
imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text ) : array - A megadott méretben, szöggel ó, megadott koordinátájú helyre, színnel egy TTF font-tal kiír egy szöveget. A TTF fontnak a szerveren a PHP által olvasható könyvtárban kell lennie. A szöveg UTF-8 kódolású.
 
imageloadfont ( string $file ) : int - betölt egy font fájlt a szerverről a memóriába. A font fájlok gdf kiterjesztésű fájlok lehetnek és az interneten találhatók ilyenek ingyenesen is. (pl. http://www.danceswithferrets.org/lab/gdfs/). A visszaadott értéket utána más a képre rajzoló utasításokban lehet használni.
 
imagefontheight ( int $font ) : int, imagefontwidth ( int $font ) : int - ha szükséges le lehet kérdezni a font magasságát és szélességét is. az eredményt pixelben kapjuk meg.
 
imagechar ( resource $image , int $font , int $x , int $y , string $c , int $color ) : bool - Kiír a megadott fonttal, a megadott helyre és színnel egy karaktert vízszintesen.
 
imagecharup ( resource $image , int $font , int $x , int $y , string $c , int $color ) : bool - Ugyanaz, mint az előző, csak függőlegesen írja ki a karaktert.
 
imagestring ( resource $image , int $font , int $x , int $y , string $string , int $color ) : bool - A képre kirajzol az adott koordinátákkal kezdődően a megadott (és korábban betöltött) fonttal egy szöveget vízszintesen, a megadott színnel.
 
imagestringup ( resource $image , int $font , int $x , int $y , string $string , int $color ) : bool - A képre kiír egy szöveget függőlegesen. A paraméterek ugyanazok, mint az előző függvényben.

Kép színeinek és egyéb paramétereinek módosítása (imagefilter)

A GD könyvtárban egy függvény van, amellyel nagyon sok szín, fényesség és egyéb paramétereket változtató megoldásokat lehet alkalmazni. A különböző funkcióktól függően kicsit változik a függvény paraméterezése.
 
A függvény általános alakja:
 
imagefilter ( resource $image , int $filtertype , int $arg1 = ? , int $arg2 = ? , int $arg3 = ? , int $arg4 = ? ) : bool - A $filtertype paramétertől függ az alkalmazandó funkció és a további paraméterek léte és jelentése.
 
Kontraszt változtatása:
 
  • IMG_FILTER_NEGATE: Negatív kép létrehozása
  • IMG_FILTER_GRAYSCALE: Szürkeárnyalatos kép létrehozása.
  • IMG_FILTER_BRIGHTNESS: A kép fényességének állítása. Az arg1 állítja be a fényességet -255...+255-ig.
  • IMG_FILTER_CONTRAST: A kontraszt állítása. Ha arg1 negatív, akkor nő a kontraszt.
  • IMG_FILTER_COLORIZE: A szín telítettségét növeli. Az arg1, arg2 and arg3 a Red, Green, Blue komponenst jelenti, az arg4 az átlátszóságot. Minden paraméter 0..255 között lehet.
  • IMG_FILTER_EDGEDETECT: A fényességváltozást kiemeli. Vagyis a képen lévő élek változását megnöveli!
  • IMG_FILTER_EMBOSS: A képen EMBOSS hatást hoz létre.
  • IMG_FILTER_GAUSSIAN_BLUR: Homályosítás az ún. "Gaussian" módszerrel.
  • IMG_FILTER_SELECTIVE_BLUR: A képet homályosítja.
  • IMG_FILTER_MEAN_REMOVAL: kiveszi a képből a "rajz" effektust.
  • IMG_FILTER_SMOOTH: Lágyítja a képet. Az arg1 a lágyítás mértéke.
  • IMG_FILTER_PIXELATE: Pixelesebbé teszi a képet. Az arg1 a pixelblokkok méretét adja meg,  az arg2 a pixelezés módját adja meg.
  • IMG_FILTER_SCATTER: Szórás hatást hoz létre. Az arg1 és arg2 tmeghatározza a szórás erősségét és az arg3 egy tömb, amiben a színek vannak definiálva.

A fenti paraméterek változhatnak a PHP verziójától függően és a jelenleginél nincsen egzaktabb leírásuk.

A GD grafikáról innen lehet bővebb leírást kapni: https://www.php.net/manual/en/ref.image.php

Az Imagick grafikláról innen lehet bővebbet megtudni: https://www.php.net/manual/en/class.imagick.php