Nette\Image – návratový image type
- David Grudl
- Nette Core | 8218
Nevím, jestli právě tohle je chtěné chování. Pokud třeba obrázek otevírám, abych ho zmenšil, pak vstupní formát nemusí být pro uložení právě ideální.
- onge
- Člen | 53
Na druhou stranku ale treba preulozeni GIFu do JPG nemusi dopadnout dobre(fleky) a naopak (ztrata barev v gifu). Takhle, pokud je mi znamo, bych si musel zjistit typ souboru nekde mimo a pak ho predat. Jelikoz ale fromFile vraci primo resource, tak si nedokazu predstavit, jak by se dalo udelat, aby k tomu predaval jeste typ.
- crempa
- Člen | 198
No podle me by stacilo pridat do konstruktoru druhy parametr definujici dany
typ a ten si ulozit jako promennou a pak ji pri exportu pouzit. Nebo by uplne
stacilo aby si alespon trida pamatovala z jakeho typu resource vzniknul a byla
schopna ho pres nejake getType()
vratit… Tim by se obesla nutnost
pouzivat primo funkce GD pokud chce clovek dosahnout funkcionality
zminene vyse..
- David Grudl
- Nette Core | 8218
Podle mého je vstupní formát nepodstatná informace: jeho smysl padá okamžikem načtení obrázku do nějaké interní podoby.
Přeuložení GIF do JPG není vhodné proto, že GIF je určený pro obrázky s paletou, JPG pro truecolor fotografie. Vedle toho takový TIFF je vhodný pro uložení obojího.
Takže není lepší prostě něco takového?
$image->send( $image->isTrueColor() ? Image::JPEG : Image::GIF );
- onge
- Člen | 53
To je sice pravda, ale pokud napr. resizuji obrazek s tim, ze ho budu chtit zobrazovat na webu, tak TIFF neni dobrym resenim a pokud to budu chtit ulozit s TIFFu do JPG nebo GIFu, tak jsme tam, kde jsme byly (na jednobarevnych plochach z puvodniho GIFu udela JPEG fleky, GIF by zas z puvodniho JPG osekal barvy). Tady to neni ani tak otazka, jestli je to True Color, nebo ne, jako spis jestli se jedna o ztratovou, nebo neztratovou kompresi.
Dalo by se rict, ze tenhle problem resi PNG, kde nedochazi ani ke ztratam kvality, ani ke ztratam barev, ale jeho vyuziti na webu je zas kvuli sporadicke podpore trochu komplikovanejsi.
Je ale fakt, ze pripady, kdy je potreba tohle resitu, budou asi docela vzacne a neni asi nutne resit to na urovni frameworku.
- kravčo
- Člen | 721
onge napsal(a):
Dalo by se rict, ze tenhle problem resi PNG, kde nedochazi ani ke ztratam kvality, ani ke ztratam barev, ale jeho vyuziti na webu je zas kvuli sporadicke podpore trochu komplikovanejsi.
Dovolím si nesúhlasiť, už aj pomerne malé rozmery fotografií (640×480) po uložení do PNG nabobtnajú na nereálne veľkosti (100K → 500K) – prosto na ukladanie fotografií (na webe) to rozhodne nie je vhodný formát. Nerozumiem poznámke o sporadickej podpore – majoritné prehliadače PNG dobre podporujú vo svojej ostatnej stable verzii.
- crempa
- Člen | 198
David Grudl napsal(a):
Podle mého je vstupní formát nepodstatná informace: jeho smysl padá okamžikem načtení obrázku do nějaké interní podoby.
Tak to souhlasim jen na pul, podle me muze byt aplikace kde je vstupni format dulezitou informaci pro dalsi zpracovani. Jde ale o uhel pohledu nad danou knihovnou, pokud pro ni vstup konci nactenim a nema tvorit jakousi abstraktni „obalku“ nad konkretnim souborem existujicim nekde jinde, tak to potom jo a souhlasim, ze je vstupni format nepodstatna informace…
I tak diky za odpoved :-)
- onge
- Člen | 53
kravco napsal(a):
majoritné prehliadače PNG dobre podporujú vo svojej ostatnej stable verzii.
Bohuzel, stale je prilis mnoho lidi, co pouziva IE 6 a ta ma podporu vicenez sporadickou a je potreba to resit nejakym podivnym javascriptem. Ja tedy zastavam nazor, ze kdo pouziva IE, obzvlast ve verzi 6, muze prikladat zodpovednost za vsechny nepristojnosti jen a jen sobe, ale holt je takovych lidi porad dost.
Jinak na fotky je samozrejme nejlepsi jpeg, pokud bych ale nechtel zjistovat, z jakeho formatu prevadim, png je jedina moznost, jak si nesprasit obrazky.
Editoval onge (7. 4. 2009 9:14)
- kravčo
- Člen | 721
onge napsal(a):
kravco napsal(a):
majoritné prehliadače PNG dobre podporujú vo svojej ostatnej stable verzii.
Bohuzel, stale je prilis mnoho lidi, co pouziva IE 6 a ta ma podporu vicenez sporadickou a je potreba to resit nejakym podivnym javascriptem. Ja tedy zastavam nazor, ze kdo pouziva IE, obzvlast ve verzi 6, muze prikladat zodpovednost za vsechny nepristojnosti jen a jen sobe, ale holt je takovych lidi porad dost.
Pokiaľ viem, IE 6 má problémy „len“ s priesvitnosťou, ktorá pri zmenšovaní/zväčšovaní nie je veľmi zaujímavá…
Jinak na fotky je samozrejme nejlepsi jpeg, pokud bych ale nechtel zjistovat, z jakeho formatu prevadim, png je jedina moznost, jak si nesprasit obrazky.
To je otázka, čo je pre teba dôležitejšie – to, aby bola zmenšenina v 100% kvalite (bezstratová) ale veľká ako šlak, alebo o niečo menej kvalitná a v rozumnej veľkosti. Pre mňa GIF ako formát nie je zaujímavý, fotky do PNG zmenšovať určite nebudem a keď budem potrebovať dodržať vstupný formát aj na výstupe, tak si napíšem detekciu. Myslím, že Davidove predvolené nastavenie je rozumné.
- onge
- Člen | 53
Mimo pruhlednosti jeste trochu posouva barvy, coz mi vadi skoro i vic. I pri resizovani to problem je, pac nevis, jestli ti nekdo nenahraje treba obrazek s pruhlednosti.
Samozrejme zalezi na situaci. Pokud budu mit fotogalerii, kde 99.9% budou fotky, neni problem, jedu jpeg. Pokud mi tam lidi budou posilat i kreslene obrazky (tj. obsahujici jednobarevne plochy, ktere jpeg prasi) a nebudu kontrolovat jaky format mi jde na vstupu, tak PNG je jedine me zname reseni, ktere se da pouzit, aby se zabranilo ztrate kvality a obrazky meli stale dostatecnou velikost aby se daly pouzit.
Idealni (nebo lepe receno spravne) reseni je zachovat obrazkum jejich format, k tomu ho ale nejprve musim zjistit a to je zhruba to o co tu celou dobu bezi.
- paranoiq
- Člen | 392
David Grudl napsal(a):
Podle mého je vstupní formát nepodstatná informace: jeho smysl padá okamžikem načtení obrázku do nějaké interní podoby.
podle mého je vstupní formát velice podstatná informace. pokud předpokládáme, že uživatel není úplný pitomec a nepoužívá nějaký naprosto nevhodný formát, tak nám může něco říci o tom jaká data obrázek obsahuje
pokud si porovnám ty nejpoužívanější, třeba fotografii (truecolor, ztrátová komprese), screenshot nebo vektorovou grafiku převedenou na bitmapu (truecolor, bezztrátová komprese) a animovaný obrázek (třeba avatar; paleta), není ŽÁDNÝ formát, který by byl vhodný pro všechny. pro to první se hodí jpeg, pro druhé png, pro třetí gif
Přeuložení GIF do JPG není vhodné proto, že GIF je určený pro obrázky s paletou, JPG pro truecolor fotografie. Vedle toho takový TIFF je vhodný pro uložení obojího.
Takže není lepší prostě něco takového?
$image->send( $image->isTrueColor() ? Image::JPEG : Image::GIF );
paleta-nepaleta, jsou i jiné důležité informace, které pravděpodobně vzal uživatel v potaz při volbě formátu (animace, průhlednost, rozložení souvislých ploch) a ty by tedy měl respektovat i výstupní formát
bohužel při VÝCHOZÍM nastavení Nette\Image dva z výše uvažovaných tří obrázků zničí, protože nezachová původní formát. při převodu do jpeg bude u png výsledek méně kvalitní a větší, protože pro souvislé plochy má png lepší kompresi než jpeg, u gifu dojde ke ztrátě animace (IM umí resizovat animovaný gif, GD zřejmě ne) a ke zhoršení kvality. gif jako defaultní formát použít nelze kvůli ztrátě barev. png zase proto, že u fotografií by výsledný soubor byl příliš velký, stejně jako u tiffu atd..
formáty prostě MAJÍ SVŮJ SMYSL, jinak by jsme používali jen jeden. žádný jednotný ‚interní‘ formát neexistuje. a jistě by bylo pro programátory i pro uživatele nejjednodušší, kdyby Nette\Image při úpravách zachovával ten formát, který je na vstupu, pokud programátor neurčí jinak – třeba podle pravidla „Less code, more quality“ :]
proto se také přimlouvám za změnu aktuálního chování. ať je prosím defaultně výstup stejný jako vstup
- David Grudl
- Nette Core | 8218
Mezi formáty samozřejmě jsou podstatné rozdíly, neřekl jsem opak. Ale nevidím důvod, proč by mělo platit, že po provedení různých transformací je ideální výstupní formát je ten, který byl vstupní.
- paranoiq
- Člen | 392
ano. zřejmě nějaké transformace provedeny budou, k tomu ostatně Nette\Image slouží. ale předem není známo, které konkrétní transformace bude ten který programátor provádět a jakým způsobem to ovlivní obsah obrázku, a tudíž nelze určit nějaký konkrétní defaultní formát. a když tyto údaje neznám, je podle mne nejlepší chování spolehnout se na informaci ze vstupu. pokud bude například proveden jen ořez, je změna ostatních formátů na jpeg nesmyslná
pokud nic jiného (nebo možná „ještě lépe“), mohl by alespoň Nette\Image uchovávat a zpřístupňovat informaci o typu získanou při načtení přes Image::fromFile()? jinak je totiž třeba ke zjištění původního formátu znovu a tedy zbytečně volat funkci getimagesize(), která již jednou byla volána při vytvoření objektu
- nAS
- Člen | 277
paranoiq napsal(a):
pokud nic jiného (nebo možná „ještě lépe“), mohl by alespoň Nette\Image uchovávat a zpřístupňovat informaci o typu získanou při načtení přes Image::fromFile()? jinak je totiž třeba ke zjištění původního formátu znovu a tedy zbytečně volat funkci getimagesize(), která již jednou byla volána při vytvoření objektu
Ano, to zní logicky, to by se mi také líbilo.
- crempa
- Člen | 198
>
pokud nic jiného (nebo možná „ještě lépe“), mohl by alespoň Nette\Image uchovávat a zpřístupňovat informaci o typu získanou při načtení přes Image::fromFile()? jinak je totiž třeba ke zjištění původního formátu znovu a tedy zbytečně volat funkci getimagesize(), která již jednou byla volána při vytvoření objektu
Za tohle jsem uz nahore taky zkousel lobovat.. :-)
- David Grudl
- Nette Core | 8218
To s tím druhým parameterm v konstruktoru je rozumný přístup, rád ho implementuju. Jen je potřeba počítat s tím, že obrázek může načíst také ImageMagick, který podporuje mnohem širší skupinu formátů, které pak nebude umět GD zapisovat. Kolizní třeba může být Windows Bitmap.
- Honza Marek
- Člen | 1664
Já bych implementoval nějakou metodu getOriginalType, která by vracela typ, který se zjišťuje v konstruktoru. A bylo by vystaráno.
- _Martin_
- Generous Backer | 679
Honza M. napsal(a):
Já bych implementoval nějakou metodu getOriginalType, která by vracela typ, který se zjišťuje v konstruktoru. A bylo by vystaráno.
A nebo k typům Image::JPEG
a dalším přidat
Image::ORIGINAL
nebo tak něco – a potom by to zachovávalo
stejný formát, jako je originál.