PHP allocated memory & image-create

…nekako mi se čini da puno ovih dana davim :smiley:

problem ovoga puta je sljedeći:

Radim program koji uploadanu sliku treba obraditi da od nje kreira više različitih slika…tj. cropa izvornu sliku na više djelova.
Da bi cropao sliku u jednom koraku moram napraviti vritual_image iz kojega kasnije cropam djelove:
$virtual_image=imagecreatefrompng($src);

Problem je da online server vrisne:

Allowed memory size of 268435456 bytes exhausted

Prije nego zaključimo da treba više RAM-a, volio bih razumjeti neke stvari.

Pratio sam ponašanje memorye…i koliko vidim, memorija skoči isključivo nakon linije
$virtual_image=imagecreatefrompng($src);

Evo par odnosa za koliku sliku koliko memory usage naraste:
-slika od 5MB, koristit će 22MB RAMA
-slika od 20MB, koristit će 170MB RAMA
-slika od 200MB, koristit će 650MB RAMA

Odnos svakako nije linearan. No posumnjao sam u jednu stvar i napravio sliku od svega
0.15MB koja je zauzela isto 22MB RAM-a koliko i slika od 5MB.
Ono što su te dvije slike imale zajedničko je produkt “width x height”.

Ispada da linija imagecreatefrompng($src) napuca RAM-a u ovisnosti o dimenzije slike koja joj se proslijedi.

Postavlja se pitanje, mora li tome biti tako?
Zašto bi slika od 0.15MB morala zauzeti 22MB RAM-a kako bi se obrađivala?
Postoji li način da cropam sliku bez da radim virtual_image na način kako gore radim?

Hvala na bilo kakvoj sugestiji.

Nisam to nikad radio, ali da li si probao s ovim:
http://php.net/manual/en/function.imagecopy.php
pa se rucno pomicati po slici…
Pretpostavljam da ova tvoja funkcija radi neku vrstu raw formata bez ikakve kompresije. Zato alocira memoriju za svaki pixel, pa to onda ispada gro.

Heh, pogledaj ulazne parametre toj copy funkciji. Parametrar resource je upravo taj virtual-image koji mi jede RAM. Mozes vidjeti dolje u example da prvo naprave taj virtual image kojeg onda prosljede u imgCopy funkciju.