PNGの規格
pngの規格
2024-10-20時点の最新のpng規格はISO/IEC 15948:2003PNG Documentation
Portable Network Graphics (PNG) Specification (Second Edition)
現在Third EditionのDraftが作成中
/nota-techconf/15分で読めた気になるPNG
PNG (Portable Network Graphics) Register and Extensions
extensionsの規格の最新版は、libpngにあるv1.4ではなく、↓のようだ
Extensions to the PNG 1.2 Specification, version 1.5.0
EXIF eXIF chunkの定義がある
構造
PNG file signatureと、それに続くPNG Chunkの配列のみで構成されている
PNG file signature
/nota-techconf/15分で読めた気になるPNG#6285fa5204b6340000ba4033
89 50 4E 47 0D 0A 1A 0A
"\x89PNG\r\n\x1A\n"
\x89はUTF-8でencodeすると\xc2\x89に変わってしまうので、TextEncoderによる比較は不能
8 byteで構成されている
byte orderはnetwork byte orderを採用しているhttps://www.w3.org/TR/2003/REC-PNG-20031110/#3networkByteOrder
PNG Chunk layout
Length: Chunk Dataの長さ
0<=Length<2^31, 4bytes
Chunk Type
4文字(4bytes)で指定される
Chunk Data
CRC: Chunk TypeからChunk Dataまでのデータの巡回冗長検査
CRC-32 algorithmを使っているhttps://www.w3.org/TR/2003/REC-PNG-20031110/#5CRC-algorithm
PNG Chunk Type
https://www.w3.org/TR/2003/REC-PNG-20031110/#5Chunk-naming-conventions
case sensitiveで、大文字か小文字かにも情報が含まれている
大文字=0,小文字=1で1bitの情報とみなし、前から順に次のように名付けられている
1. Ancillary bit
0: Critical chunk (必須chunk)
かならず解釈できないといけない
1: Ancillary chunk (補助chunk)
知らないものは無視していい
このシステムを使って、APNGなどの独自拡張をいくらでも作れる
2. Private bit
0: Public chunk
specなどで定義されたchunk
1: Private chunk
好き勝手に自由なchunkにしていい
https://www.w3.org/TR/2003/REC-PNG-20031110/#12Use-of-private-chunks
3. Reserved bit
将来の拡張のための予約
今のところ常に0
4. Safe-to-copy bit
0: unsafe to copy
1: safe to copy
PNG editorsのための情報 https://www.w3.org/TR/2003/REC-PNG-20031110/#14Ordering
/nota-techconf/15分で読めた気になるPNG#6285fa6b04b6340000ba4040
https://www.w3.org/TR/2003/REC-PNG-20031110/#5ChunkOrdering
specで定義されているPNG Chunks
Critical chunkshttps://www.w3.org/TR/2003/REC-PNG-20031110/#11Critical-chunks
IHDR Image header
PLTE Palette
IDAT Image data
IEND Image trailer
Ancillary chunkshttps://www.w3.org/TR/2003/REC-PNG-20031110/#11Ancillary-chunks
tRNS Transparency
cHRM Primary chromaticities and white point
gAMA Image gamma
iCCP Embedded ICC profile
sBIT Significant bits
sRGB Standard RGB colour space
tEXt Textual data
zTXt Compressed textual data
iTXt International textual data
bKGD Background colour
hIST Image histogram
pHYs Physical pixel dimensions
sPLT Suggested palette
tIME Image last-modification time
出現順序が決まっているhttps://www.w3.org/TR/2003/REC-PNG-20031110/#5ChunkOrdering
正規表現で書くのは難しそう
IHDRが必ず先頭、IEND必ず末尾にくる
その中で
zTXt,tEXt,iTXtはどこにでも0回以上出現していい
tIMEはどこにでも0~1回出現していい
IDATはどこにでも1回以上出現していい
ただし連続して出現すること。間に他のchunksを挟んではならない
PLTEはIDATの前方ならどこにでも出現していい
colour type=3 (index color)のときは1回
colour type=2,6のときは0~1回
colour type=0,4のときは0回
cHRM,gAMA,sBIT,iCCP,sRGBはPLTEとIDATの前方ならどこにでも0~1回出現していい
うち、iCCP,sRGBはどちらか一方しか出現できない
bKGD,hIST,tRNSはPLTEとIDATの間ならどこにでも0~1回出現していい
pHYsはPLTEのないIDATの前方ならどこにでも0~1回出現していい
sPLTはPLTEのないIDATの前方ならどこにでも0~1回出現していい
code:txt
IHDR(
(zTXt|tEXt|iTXt)*
tIME?
(zTXt|tEXt|iTXt)*
(
(cHRM|gAMA|sBIT|iCCP|sRGB)?(PLTE(bKGD|hIST|tRNS)?)?
|pHYs?
|sPLT*
)IDAT+
(zTXt|tEXt|iTXt)*
tIME?
(zTXt|tEXt|iTXt)*
)
filtering
https://www.w3.org/TR/2003/REC-PNG-20031110/#9Filters
PNG を自力で読んで表示しよう その2 - 雑念日記
encoderの必須・推奨仕様
https://www.w3.org/TR/2003/REC-PNG-20031110/#12Encoders
decoderとviewerの必須・推奨仕様
https://www.w3.org/TR/2003/REC-PNG-20031110/#13Decoders
interlace
歯抜けのピクセルデータを先に返して、順次間のピクセルデータを渡す
低解像度の画像を先に写すことで、ロード体験を改善できる
https://zenn.dev/knowledgework/articles/read-png-file
https://darkcrowcorvus.hatenablog.jp/entry/2017/02/12/235044#参考にしたサイトさん
GIF animationがわかりやすい
Adam7 algorithmを使っている
https://en.m.wikipedia.org/wiki/Adam7_algorithm
https://www.setsuki.com/hsp/ext/png.htm
https://web.archive.org/web/20081201100642/http://www.sutv.zaq.ne.jp:80/linuz/tks/PngSpec1.2/PNG-Contents.html
v1.2の日本語訳
#2024-10-29 08:47:50
#2024-10-23 09:35:43
#2024-10-20 08:10:45
#2024-10-18 23:19:07