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 imagick 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ábban,
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_points 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.
Kitöltött alakzatok rajzolása
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 kiíratá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 grafikáról innen lehet bővebbet megtudni: https://www.php.net/manual/en/class.imagick.php
- 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 grafikáról innen lehet bővebbet megtudni: https://www.php.net/manual/en/class.imagick.php