Portable Network Graphics: Porovnání verzí

Přidáno 3 020 bajtů ,  před 3 lety
+kapitoly o chuncích; -zbytečná věta o nepodporování CMYK; další opravy a úpravy
(→‎JPEG: aktualizace (dle kapitoly Historie a vývoj) a zestručnění věty o Exif)
(+kapitoly o chuncích; -zbytečná věta o nepodporování CMYK; další opravy a úpravy)
}}
'''PNG''' (oficiální výslovnost „ping“, ''Portable Network Graphics'', česky ''přenosná síťová grafika'') je [[grafický formát]] určený pro [[bezeztrátová komprese|bezeztrátovou kompresi]] [[rastrová grafika|rastrové grafiky]]. Byl vyvinut jako zdokonalení a náhrada formátu [[GIF]], který byl [[patent]]ově chráněný ([[LZW]] [[algoritmus]]), dnes jsou patenty prošlé. PNG nabízí podporu 24 [[bit]]ové [[barevná hloubka|barevné hloubky]], nemá tedy jako GIF omezení na maximální počet 256 barev současně. PNG tedy do jisté míry nahrazuje GIF, nabízí více barev a lepší kompresi (algoritmus [[Deflate]] + filtry). Navíc obsahuje osmibitovou průhlednost (tzv. [[alfa kanál]]), to znamená, že obrázek může být v různých částech různě průhledný (tzv. [[RGBA]] barevný model). Nevýhodou PNG oproti GIF je praktická nedostupnost jednoduché [[animace]], pro kterou sice existují 2 návrhy [[APNG]] a [[MNG]], které se ale zatím neprosadily. PNG se stejně jako formáty [[GIF]] a [[JPEG]] používá na [[Internet]]u.
 
Formát PNG nepodporuje systém kladení barev [[CMYK]].
 
Podle [[MIME]] má PNG přidělen typ <code>image/png</code>.
 
== Historie a vývoj ==
Impuls pro vytvoření formátu PNG přišel v roce [[1994]], kdy po dohodě firem Unisys a CompuServe došlo k licenčnímu zpoplatnění použití formátu GIF. Upravená licence se pak začala vztahovat nejen na velké firmy, ale i na programátory vyvíjející freeware, shareware a také programy šířené pod volnou licencí ([[GNU General Public License|GPL]]). Tato politika vyvolala velkou vlnu odporu, která vyvrcholila akcí „Burn All GIFs“, které se zúčastnily jak velké softwarové firmy, tak samotní programátoři na svých soukromých stránkách.
 
[[16.1 leden|16. ledna]] [[1995]] firma CompuServe zahájila vývoj nového grafického formátu GIF, který měl nahradit stávající GIF. Nový formát pod názvem GIF24 neměl být zatížený patenty (změna komprimačního algoritmu), maximální počet barev měl být zvýšen z 256 na 16 milionů.
 
Současně s vývojem GIF24, avšak ne u žádné softwarové firmy, se začalo s vývojem naprosto nového formátu, který neměl být vázán žádným patentem ani vztahem k žádné firmě a předčil by tehdejší grafické formáty (především GIF, JPEG). Původní název zněl PBF (Portable Bitmap Format), ale posléze byl změněn na PNG (Portable Network Graphics).
 
* [[1. říjen|1. října]] [[1996]] – byla uvolněna verze 1.0 se standardem [[RFC]] a [[World Wide Web Consortium|W3C]].
* [[31. prosinec|31. prosince]] [[1998]] – verze 1.1, s malým počtem změn a přidáním tří nových chunků (datových bloků, dosl. ''kusů'', ''soust'' nebo ''špalků'').
* [[11. srpen|11. srpna]] [[1999]] – verze 1.2, přidání jednoho speciálního chunku.
* [[10. listopad]]u [[2003]] – Z PNG se stává mezinárodní norma ([[International Organization for Standardization|ISO]]/[[International Electrotechnical Commission|IEC]] 15948:2003). Tato verze PNG je mírně odlišná od verze 1.2, ale není zde žádný nový chunk.
 
== Technické detaily ==
Soubor PNG se skládá z hlavičky souboru a série chunků (datových bloků, doslova ''kusů'', ''soust'' nebo ''špalků'').
 
=== Hlavička souboru ===
Hlavička souboru (nikoliv hlavička obrazu – ta bude popsána níže) neboli magické číslo v PNG má délku 8 [[Byte|bytů]] a je v každém souboru stejná. [[Šestnáctková soustava|HexadecimálníHexadecimálně]] vyjádření:má podobu <code>89 50 4E 47 0D 0A 1A 0A</code>.
 
{|class=wikitable
|-
|89
|Jednájedná se o byte s nejvýše nastaveným bitem.Detekce; podporydetekce 8podpory bitového8bitového přenosu dat.
|-
|50&nbsp;4E&nbsp;47
|Řetězecřetězec „'''PNG'''“ kódovaný v [[ASCII]]; slouží k identifikaci souborového formátu.
|-
|0D&nbsp;0A
|(CR LF) [[Nový řádek|Koneckonec řádky]] v [[DOS]]u kódovaný v [[ASCII]].; Detekcedetekce náhrady za jinou sekvenci.
|-
|1A
|Bytebyte zastavující výpis souboru v [[DOS]]u.
|-
|0A
|Vv [[Unix|UNIXu]] detekce konce přenosu (LF).
|}
 
=== Chunk uvnitř souboruChunky ===
PoKaždý hlavičce přichází série chunků, z nichž každýchunk zprostředkovává jistou informaci o obrazu nebo metadatech. Chunky deklarují sebe jako „rozhodující“ nebo „pomocné“. Pokud se program setká s pomocným chunkem, kterému nerozumí, může ho bezpečně ignorovat. Struktura tohoto chunku je založenazvolena tak, aby dovolovala slučitelnost PNGobrazů formátůPNG se staršími verzemi.
 
Každý chunk se skládá ze čtyř částí: délky (4 byty), typu/názvu (4 byty), samotných dat a [[Cyklický redundantní součet|kontrolního součtu]] (4 byty).
Každý chunk má hlavičku specifické velikosti a typu. Pak ihned následují vlastní data, posléze probíhá [[Cyklický redundantní součet|kontrolní součet]] dat. Chunky jsou dány čtyřmi znaky v [[ASCII]] s vlastností [[Case sensitivity|case sensitive]]. Rozdílnost znaků (pátý bit je číselná hodnota) poskytuje možnost dešifrovat informaci o povaze chunku v případě jeho nerozeznatelnosti.
 
==== Typy chunků ====
První znak signalizuje, zda je chunk rozhodující nebo ne. Pokud je první znak velké písmeno, chunk je rozhodující; pokud ne, jedná se o pomocný chunk. Rozhodující chunk obsahuje informaci, která je nezbytná ke čtení souboru. Pokud dekodér nerozezná rozhodující chunk, čtení souboru se buď přeruší, nebo je uživatel informován vhodným varováním.
KaždýTyp chunk má hlavičku specifické velikosti a typu. Pak ihned následují vlastní data, posléze probíhá [[Cyklický redundantní součet|kontrolní součet]] dat. Chunky jsouje dánypopsán čtyřmi znaky v [[ASCII]] s vlastností [[Case sensitivity|case sensitive]]. Rozdílnost znaků (pátý bit je číselná hodnotaznaku) poskytuje možnost dešifrovat informaci o povaze chunku v případě jeho nerozeznatelnosti.
 
* První znak signalizuje, zda je chunk rozhodující nebo ne. Pokud je první znak: velké písmeno, chunk jeznamená rozhodující; pokud nechunk, jednámalé se opak pomocný chunk. Rozhodující chunk obsahuje informaci, která je nezbytná kek čtenínačtení souboruobrazu. PokudNaopak dekodérjakýkoliv nerozezná rozhodujícípomocný chunk, čteníkterému souborudekodér se buď přerušínerozumí, nebo je uživatel informovánmůže vhodnýmbezpečně varovánímignorovat.
* 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. přizpůsobené podle PNG specifikace.Je Rezervovanýrezervovaný pro budoucí expanzi. V případě malého písmene na pozici třetího znaku 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 kritických chunků.
 
===== Rozhodující chunky =====
Třetí znak musí být velké písmeno přizpůsobené podle PNG specifikace. Rezervovaný pro budoucí expanzi. V případě malého písmene na pozici třetího znaku by měl dekodér jednat s tímto chukem jako s jakýmkoliv jiným neznámým.
* <code>IHDR</code> představuje hlavičku obrazu (nikoliv hlavičku souboru – ta byla popsána výše). Obsahuje (v tomto pořadí) šířku obrazu (4 byty), výšku obrazu (4 byty), bitovou hloubku (1 byte), typ kódování barev (1 byte), metodu komprese (1 byte), metodu filtrování (1 byte) a metodu prokládání (1 byte) – celkem tedy 13 datových bytů. Musí být prvním chunkem.<ref>{{Citace elektronického periodika
| příjmení = Tišnovský
| jméno = Pavel
| titul = Anatomie grafického formátu PNG
| periodikum = Root.cz
| odkaz na periodikum = https://www.root.cz
| vydavatel = Internet Info, s.r.o.
| url = https://www.root.cz/clanky/anatomie-grafickeho-formatu-png/#k06
| datum vydání = 2006-09-07
| issn = 1212-8309
| datum přístupu = 2018-06-27
}}</ref>
* <code>PLTE</code> obsahuje [[Barevná paleta|paletu]] neboli seznam barev. Je povinný, pokud typ kódování barev (určený v IHDR) je paleta. Počet barev je mezi 1 a 256. Každá barva je uložená v [[RGB]] a zabírá 3 byty.
* <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ý.
 
===== Pomocné chunky =====
Č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 kritických chunků.
* <code>bKGD</code> určuje výchozí barvu pozadí. Ta se má použít, pokud není jiná vhodnější volba, např. v prohlížečích obrázků (ale ne ve webových prohlížečích).
* <code>cHRM</code> nese informaci o chromatičnosti.
* <code>eXIf</code> obsahuje metadata ve formátu [[Exif]].
* <code>gAMA</code> obsahuje gama korekci.
* <code>hIST</code> představuje histogram neboli celkový (nebo i proporcionální) počet výskytů každé barvy z <tt>PLTE</tt> v obrazu. Může usnadnit volbu barev na zařízení, které nedokáže zobrazit všechny požadované barvy.
* <code>iCCP</code> je [[Barevný profil|barevný profil ICC]].
* <code>iTXt</code> obsahuje text s podporou [[UTF-8]], včetně anglického názvu, jazyka a názvu. Může být komprimovaný.
* <code>pHYs</code> určuje zamýšlenou fyzickou velikost pixelu a/nebo poměr horizontální a vertikální velikosti pixelu.
* <code>sBIT</code> vyjadřuje přesnost barev zdrojových dat.
* <code>sPLT</code> navrhuje paletu, pokud zařízení neumí zobrazit všechny barvy použité v obrazu.
* <code>sRGB</code> znamená, že je použitý barevný prostor [[sRGB]].
* <code>sTER</code> je indikátor prostorového obrazu.
* <code>tEXt</code> obsahuje text ve znakové sadě [[ISO 8859-1]], včetně názvu tohoto textu.
* <code>tIME</code> obsahuje datum a čas poslední úpravy obrazu.
* <code>tRNS</code> určuje průhlednost. U obrazů s paletou obsahuje hodnoty průhlednosti jedné nebo více barev z palety. U obrazů v [[Barevná hloubka#Používané barevné hloubky|pravých barvách]] a ve stupních šedi určuje jedinou barvu, která je zcela průhledná.
* <code>zTXt</code> je podobný jako <tt>tEXt</tt>, ale text je komprimovaný.
 
=== Komprese ===