Natrag   Forum.hr > Informatička tehnologija > Za napredne korisnike > Programiranje

Programiranje Za programere i one koji to žele postati ...

Odgovor
 
Tematski alati Opcije prikaza
Old 24.02.2017., 19:13   #1
PHP allocated memory & image-create

Pozdrav,

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:

PHP Code:
$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.
bozoou is offline  
Odgovori s citatom
Old 25.02.2017., 15:19   #2
Da bi se slika mogla obrađivati, mora se dekompresirati, a to se radi u RAM-u. Zbog toga korištenje memorije ovisi o broju piksela, a ne o veličini datoteke.

Navedena funkcija koristi ekstenziju GD koja guta daleko više resursa od Imagick ekstenzije. Korištenjem Imagick ekstenzije bi mogao obraditi daleko veće slike nego GD ekstenzijom. U osnovi, ako želiš napraviti sustav kompatibilan sa širokim spektrom servera, trebao bi ići na:
1.) Imagick kao ekstenzija, ako je dostupan
2.) Ako ne, onda pozivaš imagic preko konzolne linije
3.) Ako pristup funkcijama za izvršavanje sistemskim naredbama nije dostupna, koristiš GD

U svim varijantama, trebao bi testirati veličinu slike i javiti korisniku ako se ne može obraditi.
MrBlc is offline  
Odgovori s citatom
Old 25.02.2017., 15:24   #3
Hvala na pojašnjenju...baš sam i naletio negdje na pojašnjenje da za obradu slike memorija ovisi o rezoluciji slike.
bozoou is offline  
Odgovori s citatom
Odgovor



Kreni na podforum




Sva vremena su GMT +2. Trenutno vrijeme je: 18:45.