JPEG: kvalita vs velikost

Před pár dny jsem řešil problém ohledně jednoho webu. Zákazník je fotograf a chtěl mít možnost se prezentovat s tím, že by mohl fotky sám vkládat a řadit do galerií. Všechno šlo hladce, jenom ke konci, když bylo prakticky hotovo, jsme se shodli, že se fotky nenačítají zrovna nejrychleji. On totiž výpis galerie nebyl klasicky, ve formě tabulky s miniaturami, ale formou šoupacího pásu fotek, kde miniatury nebyly tak docela miniaturní (asi 350px na výšku). A já jsem se ve snaze co nejvíc zmenšit velikost fotek dostal až k poměru kvality a výsledné velikosti souboru s JPEG kompresí.

Aby bylo jasno – po nahrání na server se fotky zmenšují z původních několika megapixelů na nějakou rozumnou velikost. K tomu mi slouží kratičký skriptík používající PHP GD knihovnu, konkrétně její funkci imagejpeg. A podobně jako v grafických editorech je možné při ukládání do JPEG zvolit kvalitu, je to možné i u této knihovní funkce.

Vyzkoušel jsem přes GD prohnat následující tři obrázky (vkládám jen miniatury, původní obrázky měly odlišné rozměry)

http://sxc.hu

http://sxc.hu

deviantArt ~RedFraction

deviantArt ~RedFraction

Vlastní foto N5800

Vlastní foto N5800

Jde tedy o běžné fotky, které by měly být pro JPEG kompresi vhodné. Ta totiž, podobně jako MP3, odstraňuje detaily, které lidské oko nedokáže rozeznat. Dobře proto komprimuje zejména fotky, které už ze své povahy obsahují množství přechodů a zároveň minimum (opravdu) ostrých hran.

Závislost velikosti na zvolené kvalitě

Závislost velikosti na zvolené kvalitě

Z grafu je ihned zřejmé, že není vhodné slepě nastavovat kvalitu na hodnotu 100. Výsledek je totiž několikrát větší, než původní obrázek! Někde těsně před kvalitou 90 má výsledný soubor stejnou velikost jako originál. To je potom nejvyšší hodnota, kterou je radno používat. Samozřejmě v takovém případě je lepší použít přímo originál (za předpokladu že pomocí GD pouze přeukládáte).

Příjemné ale je, že kolem kvality 50 má výsledek poloviční velikost oproti originálu, zatímco rozdíl je pro lidské oko pořád ještě velmi malý. To samozřejmě platí především u menších obrázků, pokud srovnáváte n-megapixelovou fotku v originále a po kompresi, byť na 50, rozdíl patrně uvidíte. Hranicí únosnosti, kterou bych si ještě dovolil použít na webu by pro mě byla kvalita kolem 30.

Pro náhledy fotek na stránce (záměrně neříkám miniatury) jsem nakonec zvolil kvalitu někde mezi 60 a 70. Pro opravdové miniatury bych se nebál jít ke čtyřicítce, přece jenom jde o náhled a každý, koho fotka zaujme, si ji nechá zobrazit ve větší velikosti s menší úrovní komprese. Všechny tyto hodnoty jsou samozřejmě jen přibližné a nelze je brát jako dogma. Každý obrázek má jinou povahu a je jinak vhodný k JPEG kompresi, tudíž může vykazovat různé výsledky. Snažil jsem se ale brát průměrné hodnoty, které by byly obecně použitelné.

This entry was posted in Užitečné. Bookmark the permalink.

2 Responses to JPEG: kvalita vs velikost

  1. Jaa(c) says:

    Ten graf je docela zajímavý, stejně jako článek :)
    Jen moc nesouhlasím s tím, že u kvality 50 je oproti originálu jen malý rozdíl.. Možná jsem moc háklivý, ale mně se zdá ten rozdíl veliký, 60 je pro mě tak hranice únosnosti..

    OdpovědětOdpovědět
  2. Shabbi. says:

    @Jaa(c): Ono je to hodně subjektivní a taky záleží na tom, co na obrázku je a jak je obrázek velký.
    Někde algoritmus pro jpeg kompresi funguje tak, že je po každé kompresi (co se vnitřní struktury týče) obrázek úplně jiný. Proto není možné vypočítat skutečnou ztrátu kvality (rozdíly mezi pixely) a vše zůstává na citu pozorovatele.
    Celkem škoda, to by byl teprve zajímavý graf :)

    OdpovědětOdpovědět

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">