Oznámení

Fórum bylo uzavřeno. Využijte prosím služeb serverů JakPsatWeb, Builder nebo Webtrh.

#1 před 3 lety

piler
Člen
Registrovaný: 30. 7. 2008
Příspěvky: 147

Image resize a PHP memory_limit

Zdravim,

mam taky problem. Mam script, ktory z uploadovanych obrazkov robi tzv. nahlady. Problem nastava vtedy, ak je obrazok vo velkom rozliseni a nastavanie PHP > memory_limit je mensie ako mnozstvo pamate potrebnej na zmensenia obrazka pomocou PHP. Na niektorom hostingu sa da poziadat o zvysenie memory_limit, ale niekde to nejde.

Je nejaka tabulka, alebo sposob vypoctu, ze napr. pri memory_limit = 32M dokaze byt zmensena fotka (alebo ina akcia s obrazkom) s max. rozlizenim (max velkostou suboru) 1024×1024px (2 MB).

 

#2 před 3 lety

Tomik
Nette Evangelist
Registrovaný: 20. 3. 2005
Příspěvky: 566

Re: Image resize a PHP memory_limit

Já používám něco takového:

<?php
  $size = ($source_x * $source_y * 3) + memory_get_usage(); // tu $size pak porovnám s memory_limit
?>

Přičemž tu 3 jsem někde vyčetl, kde, to už si nevzpomenu, ale zatím se mi nestalo, že by byl někde problém. :)

Jinak pokud to jde, doporučuji použít ImageMagick

 

#3 před 3 lety

_Martin_
Člen
Registrovaný: 26. 9. 2008
Příspěvky: 722

Re: Image resize a PHP memory_limit

Předpokládám, že používáš funkce z GD knihovny. Není na tom hostingu k dispozici i ImageMagick formou spustitelných prográmků? Tím by se memory_limit vyřešil.

Edit: Tak Tomik byl rychlejší =)

Editoval _Martin_ (11. 2. 2009 13:13)

 

#4 před 3 lety

Wosonj
Člen
Registrovaný: 22. 12. 2008
Příspěvky: 65

Re: Image resize a PHP memory_limit

minimalni mnozstvi pameti, ktere je k teto operaci potreba, bude x*y*bpp + samozrejme velikost noveho obrazku + rezie skriptu. Nekde jsem cetl, ze se to da obejit pres image_magick – rozireni ale musi byt povolene a nevim, jestli to je o tolik pametove uspornejsi. Domnivam se, ze spis se jen obejde memory limit tim, ze se vola shellovy skript, ktery si alokuje vlastni pamet.

Editoval Wosonj (11. 2. 2009 13:13)


hledáme zkušené programátory v PHP / Nette: http://www.twobits.cz/volna-mista/

 

#5 před 3 lety

Tomik
Nette Evangelist
Registrovaný: 20. 3. 2005
Příspěvky: 566

Re: Image resize a PHP memory_limit

Ano, zavolá to externí program, takže to ten problém s pamětí vyřeší, resp. stále je člověk limitován fyzickou pamětí, ale nepředpokládám, že by změnšování 2MB obrázku dokázalo zaplnit několik GB ramky… :)

 

#6 před 3 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: Image resize a PHP memory_limit

Podpora pro ImageMagick je v Nette\Image, pokud je na serveru ImageMagick, volá se on, jinak se veme GD knihovna, viz zde, zde a zde.

Editoval romansklenar (11. 2. 2009 13:28)

 

#7 před 3 lety

piler
Člen
Registrovaný: 30. 7. 2008
Příspěvky: 147

Re: Image resize a PHP memory_limit

Tomik napsal(a):

Já používám něco takového:

<?php
  $size = ($source_x * $source_y * 3) + memory_get_usage(); // tu $size pak porovnám s memory_limit
?>

Přičemž tu 3 jsem někde vyčetl, kde, to už si nevzpomenu, ale zatím se mi nestalo, že by byl někde problém. :)

Jinak pokud to jde, doporučuji použít ImageMagick

ImageMagick nie je mozne vzdy pouzit, tak sa snazim o nejake univerzalne riesenie. Nejak ale nechapem, preco tam pouzivas memory_get_usage(). Kazdopadne, dik za radu

 

#8 před 3 lety

piler
Člen
Registrovaný: 30. 7. 2008
Příspěvky: 147

Re: Image resize a PHP memory_limit

romansklenar napsal(a):

Podpora pro ImageMagick je v Nette\Image, pokud je na serveru ImageMagick, volá se on, jinak se veme GD knihovna, viz zde a zde.

To som nejak v nette nepostrehol :). Vyzera to super. teda musis kontrolovat, ci je ImageMagick nainstalovane. Ma Nette\Image implementovane aj nieco take, ak je nedostatok pamate na pracu z obrazkom, tak to vrati false, alebo exception, ktore by sa dalo zachytit a vypisat hlasku, ze nie je mozno obrazok zmensit?

 

#9 před 3 lety

Tomik
Nette Evangelist
Registrovaný: 20. 3. 2005
Příspěvky: 566

Re: Image resize a PHP memory_limit

romansklenar napsal(a):

Podpora pro ImageMagick je v Nette\Image, pokud je na serveru ImageMagick, volá se on, jinak se veme GD knihovna, viz zde, zde a zde.

Pokud se nemýlím, je to dokonce tak, že na jednodušší operace se vždy použije GD, na složitější, pokud je, IM…

 

#10 před 3 lety

Tomik
Nette Evangelist
Registrovaný: 20. 3. 2005
Příspěvky: 566

Re: Image resize a PHP memory_limit

piler napsal(a):

ImageMagick nie je mozne vzdy pouzit, tak sa snazim o nejake univerzalne riesenie. Nejak ale nechapem, preco tam pouzivas memory_get_usage(). Kazdopadne, dik za radu

To vrátí aktuální využití paměti – protože předpokládám, že už nějakou pamět používám. Chci-li tedy porovnávat potenciální zabrání paměti, které by nastalo, kdyby daný obrázek změnšoval, s maxilmálním možným zabráním paměti, potřebuju do toho započítat i ostatní věci z PHP, nejen ty obrázky. Faktem ale je, že pokud člověk nezměnšuje přímo konrétní obrázek, ale změnšuje jeden do druhého, je potřeba k tomu připočíst ještě ten zmenšený. A důsledně vždy když nějaký obrázek nepotřebuju volat destroy.

 

#11 před 3 lety

piler
Člen
Registrovaný: 30. 7. 2008
Příspěvky: 147

Re: Image resize a PHP memory_limit

Tomik napsal(a):

piler napsal(a):

ImageMagick nie je mozne vzdy pouzit, tak sa snazim o nejake univerzalne riesenie. Nejak ale nechapem, preco tam pouzivas memory_get_usage(). Kazdopadne, dik za radu

To vrátí aktuální využití paměti – protože předpokládám, že už nějakou pamět používám. Chci-li tedy porovnávat potenciální zabrání paměti, které by nastalo, kdyby daný obrázek změnšoval, s maxilmálním možným zabráním paměti, potřebuju do toho započítat i ostatní věci z PHP, nejen ty obrázky. Faktem ale je, že pokud člověk nezměnšuje přímo konrétní obrázek, ale změnšuje jeden do druhého, je potřeba k tomu připočíst ještě ten zmenšený. A důsledně vždy když nějaký obrázek nepotřebuju volat destroy.

Jasne, dnes som sa asi dobre nevyspal :D…Dik..Rozmyslam nad vyuzitim Nette\Image v spojeni s nejakou detekcnou funkciou na memory_limit…Dik za napady, pomohlo mi to :)

 

#12 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5834

Re: Image resize a PHP memory_limit

Pro 24bitové obrázky (tj. klasické JPG), se uvádí „magická konstanta“ 1.6, takže $size = $width * $height * 3 * 1.6. Pro fotku 1024×768 to máme cca 9 MB RAM, tudíž pro zmenšení počítejme s memory_limit=16M jako optimálním. Na řadě hostingů je přitom 8 MB.

Fotka z 5megapixelového foťáku vezme cca 25 MB. Pokud ji budu chtít zmenišit třeba na zmíněných 1024×768 potřebuju v paměti mít místo i na těch 9 MB. Vot matematika.

 

#13 před 3 lety

piler
Člen
Registrovaný: 30. 7. 2008
Příspěvky: 147

Re: Image resize a PHP memory_limit

David Grudl napsal(a):

Pro 24bitové obrázky (tj. klasické JPG), se uvádí „magická konstanta“ 1.6, takže $size = $width * $height * 3 * 1.6. Pro fotku 1024×768 to máme cca 9 MB RAM, tudíž pro zmenšení počítejme s memory_limit=16M jako optimálním. Na řadě hostingů je přitom 8 MB.

Fotka z 5megapixelového foťáku vezme cca 25 MB. Pokud ji budu chtít zmenišit třeba na zmíněných 1024×768 potřebuju v paměti mít místo i na těch 9 MB. Vot matematika.

Dik. Ako sa inak sprava Nette\Image ked nema dostatok pamate na spracovanie poziadavku, napr. zmensenie?

 

#14 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5834

Re: Image resize a PHP memory_limit

PHP vyhodí fatal error. Framework tohle nemá jak ovlivnit.

 

#15 před rokem

vlcakkazan
Člen
Registrovaný: 6. 4. 2011
Příspěvky: 1

Re: Image resize a PHP memory_limit

piler napsal(a):

Tomik napsal(a):

Já používám něco takového:

<?php
  $size = ($source_x * $source_y * 3) + memory_get_usage(); // tu $size pak porovnám s memory_limit
?>

Paměť pro obrázek se v případě jpg počítá jako 3(počet barev) * 8(počet kanálů) * „TWEAKFACTOR“. TWEAKFACTOR je min. 1,5, pro větší bezpečnost ale trochu více, tak 1,6. (viz http://www.php.net/…fromjpeg.php#…).
Pro odhad velikosti paměti před započetím zpracování obrázku používám skript na www.newsroom.cz

 

Zápatí