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).
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…
Tomik – tomik@jmx.cz | http://tomik.jmx.cz
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)
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/
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… :)
Tomik – tomik@jmx.cz | http://tomik.jmx.cz
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
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?
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…
Tomik – tomik@jmx.cz | http://tomik.jmx.cz
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.
Tomik – tomik@jmx.cz | http://tomik.jmx.cz
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 :)
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.
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 smemory_limit=16Mjako 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?
PHP vyhodí fatal error. Framework tohle nemá jak ovlivnit.
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