Memory limit a práca s obrázkami s použitím GD knižnice

V prípade, že pracujete s obrázkami cez PHP skript využívajúci GD knižnicu, môžete i pri spracovaní relatívne malého obrázka dostať podobné hlásenie: "Fatal error: Out of memory" alebo "Error: Exceed Memory limit. Require: xx.xx MByte", ale obrázok je veľký len 1 MB.
Ako je to možné, keď memory limit je vo väčine prípadov väčší ako spracovávaný obrázok? Vysvetlenie je nasledujúce:
 
Vytvoríme obrázok s veľkosťou 640x480 (VGA rozlíšenie) a otvoríme ho v nejakom prehliadači obrázkov - napr. IrfanView.
 
Dolný okraj (informácie o obrázku) bude vyzerať asi takto:
 
Obrázok zaberá na disku (veľkosť súboru) 5.30 KB, ale v pamäti 900.04 KB
 
 
 
 
Teraz zväčšíme rozlíšenie na 1024x768. Dostaneme nasledujúce hodnoty
 
Veľkosť obrázka je stále 5.30 KB, ale v pamäti zaberá 2.25 MB
 
 
 
 
Ako vyzerá rozlíšenie 4 Megapixelového fotoaparátu (2304x1728):
 
Potrebná veľkosť pamäte je už 11.39 MB
 
 
 
 
 
A nakoniec 7.1 Mpx fotoaparát:
Obrázok zaberá v pamäti 20.25 MB, ale veľkosť je stále 5.30 KB.
 
 
 
 
Ako je to možné? JPG, PNG (a ďalšie kompresné formáty) zmenšujú veľkosť súboru, ale na jeho úpravu je stále na každý pixel potrebná rovnaká časť pamäte (teda čím viac pixelov, tým viac pamäte je potrebné na úpravu obrázka). Z toho vyplýva, že množstvo potrebnej pamäte nezáleží iba na veľkosti súboru.
 
GD knižnica pracuje s obrázkami veľmi podobne ako klasické programy na úpravu obrázkov typu Photoshop, Paintshop atď. Na veľmi orientačné výsledky môžeme na výpočet spotreby pamäte použiť tento vzorec:
 
 
Ak používate WordPress s veľmi populárou galériou NextGEN, potom môžete z ich administračného rozhrania zistiť aktuálne využívanú pamäť pre Vašu aplikáciu (v tomto prípade wordpress a jeho pluginy):
 
 
 
Teraz sa pozrime na "memory limit" (na našich zdieľaných serveroch väčšinou ide o 128 M). Potom si už môžete sami vypočítať, aké veľké rozlíšenie obrázkov si môžete dovoliť. Z hľadiska záťaže servera je najideálnejšie mať fotografie už upravené v optimálnom rozlíšení (800 - 1000px na dlhšiu stranu). Skript na vytváranie náhľadov by ich mal pri uploade alebo prvej požiadavke ukladať do cache, odkiaľ ich pri ďalších požiadavkách jednoducho pošle na výstup bez zbytočných nárokov na prostriedky procesoru.
 
Zdroj: alexrabe.boelinger.com (publikované so súhlasom autora)