Portable Network Graphics: Porovnání verzí

Odebráno 128 bajtů ,  před 11 měsíci
→‎Chunky: faktické a jazykové opravy a úpravy
(→‎Technické detaily: rozšíření)
(→‎Chunky: faktické a jazykové opravy a úpravy)
Každý chunk zprostředkovává jistou informaci o obrazu nebo metadatech. Chunky jsou sémanticky samostatné (přímo se nepojí s jinými částmi souboru). Chunky se rozdělují na „rozhodující“ (critical) a „pomocné“ (ancillary). Rozdělení na chunky dovoluje slučitelnost obrazů PNG se staršími verzemi, stejně jako rozšiřitelnost o případné nové.
 
Každý chunk se skládá ze čtyř částí: délky obsahu (4 bajty), typu/názvu (4 bajty), samotných dat a [[Cyklický redundantní součet|kontrolního součtu]] (4 bajty). Díky tomuto návrhu mohou dekodéry formátu přeskakovat nekriticképomocné chunky, aniž by je musely číst; kontrolní součet přispívá k detekci chyb při čtenízpracování.
 
==== Typy chunků ====
Typ je popsán čtyřmi znaky v [[ASCII]] (název chunku sestává vždy z písmen) s [[Case sensitivity|citlivostírozlišením navelkých velká/maláa malých písmen]]. Použití velkého nebo malého písmena (pátý bit v kódu ASCII) v sobě nese informaci o povaze chunku v případě jeho nerozeznatelnosti.
 
* První znak signalizuje, zda je chunk rozhodující: velké písmeno znamená rozhodující chunk, malé pak pomocný. Rozhodující chunk obsahuje informaci, která je nezbytná k načtení obrazu. Naopak jakýkoliv pomocný chunk, kterému dekodér nerozumí, může bezpečně ignorovat.
* Druhý znak informuje, zda je chunk „veřejný“ (jedná se o jednoúčelový chunk) nebo „privátní“ (není standardizován). Velké písmeno značí veřejný a malé privátní chunk. To zajistí, že veřejný a privátní znak chunku se nemohou nikdy vzájemně střetnout.
* Třetí znak musí podle specifikace PNG být velké písmeno. Je rezervovaný pro budoucí expanzirozšíření. V případě malého písmene by měl dekodér jednat s tímto chukem jako s jakýmkoliv jiným neznámým.
* Čtvrtý znak signalizuje, jestli je chunk bezpečný ke kopírování pomocí editorů, které ho nerozeznají. Je-li čtvrtý znak malé písmeno, chunk může být bezpečně kopírován bez ohledu na rozsah modifikací souboru. Je-li čtvrtý znak velké písmeno, může být kopírován, jen pokud se modifikace nedotýkají žádných rozhodujících chunků.
 
}}</ref>
** Pro výšku a šířku je platných prvních 31 bitů, 32. bit je ignorován. Hodnota 0 je neplatná.
** Barevná hloubka obsahuje počet bitů na „vzorek/složku“ (nikoli pixel, s výjimkou, kdy jeden pixel ). Možné hodnoty jsou 1, 2, 4, 8 a 16.
** Typ kódování barev je složen ze tří bitů: bit 0 indikuje, zda je použita paleta; bit 1 říká, je-li obraz barevný (jinak je monochromatický); bit 2 indikuje přítomnost alfa kanál (mapu (polo)průhlednosti)kanálu.
** Metoda komprese je pouze v danésoučasné verzispecifikaci jen jedna. (hodnotaMá hodnotu 0), což proznamená kompresi LZW s 32KiB „plovoucím“ oknem.
** Metoda filtrování určuje předzpracování obrazových dat (pixelů nebo surových bajtů) před kompresí. V současné verzispecifikaci existujíje jen adaptivníjedna metodymetoda, pětimá hodnotu 0. V rámci ní existuje 5 typů filtrů: žádný, odečístrozdíl vůči levému, „nahoru“rozdíl vůči hornímu, průměrrozdíl vůči průměru levého a horního, Paethova funkce.
* <code>PLTE</code> obsahuje [[Barevná paleta|paletu]] – tabulku barev. V obrázku využívající paletu se do obrazových bodů neukládají samotné barvy, ale barevné indexy – s tím, že koncovou barvu každého atributu definuje právě paleta. Tento chunk je povinný, pokud typ kódování barev (určený v <tt>IHDR</tt>) je 3, a volitelný, má-liv typpřípadě typu kódování barev hodnotu 02 nebo 46. Počet barev je mezi 1 a 256. Každá barva je uložená v [[RGB]] a zabírá 3 bajty – každý bajt v plném rozsahu (0 až 255) pro červenou, zelenou a modrou složku v tomto pořadí. V obrázku s paletou se jako pixely neukládají samotné barvy, ale právě indexy v paletě. Chunk <tt>PLTE</tt>, je-li definován, musí být uveden před prvním chunkem <tt>IDAT</tt>. Může být uveden i pro truecolorové obrázky, coby doporučená paleta pro jeho konverzi do 256 barev.
* <code>IDAT</code> obsahuje samotná obrazová data jakožto výstup komprese. Data mohou být rozdělena do více chunků tohoto typu, což mírně zvětšuje soubor, ale umožňuje streamování.
* <code>IEND</code> označuje konec souboru a musí být posledním chunkem. Neobsahuje datovou část, proto je v každém souboru PNG stejný.
Existuje několik pravidel pro pořadí chunků.
* <tt>IHDR</tt> musí být první
* <tt>cHRM</tt>, <tt>gAMA</tt> a <tt>sBIT</tt> musí být před <tt>PLTE</tt> nebo (neníje-li) nebo před <tt>IDAT</tt>
* <tt>PLTE</tt> a <tt>pHYs</tt> musí být před <tt>IDAT</tt>
* <tt>bKGD</tt>, <tt>hIST</tt> a <tt>tRNS</tt> musí být po <tt>PLTE</tt> (je-li), ale před <tt>IDAT</tt>
* <tt>tIME</tt>, <tt>tEXt</tt>, <tt>zTXt</tt>, <tt>iTXT</tt> a <tt>eXIF</tt> nemají pravidla pořadí, jen nesmí být mezi více <tt>IDAT</tt>
* <tt>IDAT</tt> (je-li jich více) musí být všechny za sebou (pokud je víc než jeden)
* <tt>IEND</tt> musí být poslední
 
* <code>Comment</code> – povšechný komentář (do kterého nespadají položky výše); převod z formátu GIF
 
Název výše uvedených, předdefinovaných položek se musí shodovat přesně (i co do velikosti písmen), jinak bude položka chápána jako uživatelsky definovaná. Název položky a jejíhojejí hodnota jsou v chunku odděleny znakem NUL (ASCII hodnota 0). Hodnotou může být cokoli (včetně potenciálně škodlivého kódu), ale prohlížeče a dekodéry by je měly interpretovat jako prostý text.
 
=== Komprese ===