Memory limit a práce s obrázky za použití GD knihovny

V případě, že pracujete s obrázky přes PHP skript využívající GD knihovnu, můžete i při zpracovávání relativně malého obrázku dostat podobné hlášení: “Fatal error: Out of memory” nebo “Error : Exceed Memory limit. Require : xx.xx MByte”, ale obrázek je veliký jen 1MB

Jak je to možné, když memory limit je ve většině případů větší než zpracovávaný obrázek? Vysvětlení je následující:

Vytvoříme obrázek s velikostí 640 x 480 (VGA rozlišení) a otevřeme ho v nějakém prohlížeči obrázků - například IrfanView.

 

Dolní okraj (informace o obrázku) bude vypadat asi takto:

640×480 Size

Obrázek zabírá na disku (velikost souboru) 5.30 KB, ale v paměti 900.04 KB

 

Nyní zvětšíme rozlišení na 1024 x 768. Dostaneme následující hodnoty

1024 Size

Velikost obrázku je stále 5.30 KB ale v paměti zabírá 2.25 MB

 

Jak to vypadá v rozlišení 4 Megapixelového fotoaparátu (2304 x 1728) :

4 MP Size

Potřebná velikost paměti je již 11.39 MB

 

A nakonec 7.1 Mpx fotoaparát:

7.1 MP Size

Obrázek zabírá v paměti 20.25 MB ale velikost je stále 5.30 KB.

 

Jak je to možné? JPG, PNG (a další kompresní formáty) zmenšují velikost souboru, ale pro jeho úpravu je stále pro každý pixel potřebná stejná část paměti (tedy čím více pixelů, tím více paměti je pro úpravu obrázku potřebné). Z toho vyplývá, že množství potřebné paměti nezáleží pouze na velikosti souboru.

GD knihovna, pracuje s obrázky velmi podobně jako jako klasické programy pro úpravu obrázků typu Photoshop, Paintshop atd. Pro velmi orientační výsledky můžeme pro výpočet spotřeby paměti použít tento vzorec:

výška x šířka x 3(barevné kanály) x 1.65

Pokud používáte WordPress a velmi populární galerii NextGEN, pak můžete z jejího administračního rozhraní zjistit aktuálně využívanou paměť pro Vaši aplikaci (v tomto případě wordpress a jeho všechny pluginy):

Nyní se podívejte na "memory limit" - na našich sdílených serverech většinou jde o 128M. Pak si již můžete spočítat sami, jak velké rozlišení obrázků si můžete dovolit - např. paměť 128 MB teoreticky umožňuje práci s 24 Mpx obrázky o velikosti 6000 x 4000 px. Z hlediska zátěže serveru je nejideálnější mít fotografie již upravené v optimálním rozlišení (800 - 1000 px na delší stranu). Skript na vytváření náhledů by je měl při uploadu nebo prvním požadavku ukládat do cache, odkud je při dalších požadavcích jednoduše pošle na výstup bez zbytečných nároků na prostředky procesoru.


Zdroj: alexrabe.boelinger.com (publikováno se souhlasem autora)