PNG と GIF (あとJPEG) の分解
これらの画像フォーマットを一通り理解したので、 PHP で chunk 分解してみました。
図を作った方がいいかな。
PNG
- https://github.com/yoya/IO_PNG/blob/master/IO/PNG.php
- Big Endian
- 4byte length, 4byte tag(chunk type), 後ろに続く payload
- 実画像データは zlib 圧縮で格納
- 資料) http://pwiki.awm.jp/~yoya/?PNG
- dump実行例
~/git/IO_PNG% php sample/pngdump.php 4color.png Name:IHDR Size=13 CRC=4258568819 Width:2 Height2 BitDepth:8 ColorType:2(RGB) Compression:0 Filter:0 Interlate:0 Name:sRGB Size=1 CRC=2932743401 Name:gAMA Size=4 CRC=201089285 Name:cHRM Size=32 CRC=2629456188 Name:IDAT Size=22 CRC=2986498017 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 0x00000000 18 57 63 f8 ff 89 e1 ad 8c 0a 83 6f ee 67 a5 8d Wc o g ... Name:IEND Size=0 CRC=2923585666 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 0x00000000 00 ff f2 00 ed 1c 24 00 4d 6d f3 22 b1 4c $ Mm " L
GIF
- https://github.com/yoya/IO_GIF/blob/master/IO/GIF.php
- Little Endian
- 1or2byte tag(separator or introducer, extension type), 1byte length, 後ろに続く payload、tag によっては更に sub-block が続く
- sub-block は len=0 block で終端するまで連続する。
- 資料) http://pwiki.awm.jp/~yoya/?GIF
- dump実行例
~/git/IO_GIF% php sample/gifdump.php 4color.gif Signature:GIF Version:89a Screen: Width:2 Height:2 GlobalColorTableFlag:1 ColorResolution:8 SortFlag:0 SizeOfGlobalColorTable: 4 #ed1c24 #22b14c #fff200 #4d6df3 BlockLabel:0x21 ExtensionLabel:0xF9 (Graphic Control) DisposalMethod:0 UserInputFlag:0 TransparentColorFlag:0 DelayTime:0 TransparentColorIndex:0 BlockLabel:0x2C (Image) Left:0 Top:0 Width:2 Height:2 LocalColorTableFlag:0 InterlaceFlag:0 SortFlag:0 SizeOfLocalColorTable:0 ImageData.count:1
JPEG
- http://openpear.org/package/IO_SWF/src/trunk/IO/SWF/JPEG.php
- Little Endian
- 2byte tag(marker), 2byte length、後ろに続く payload, tag によっては length 無し
- SOI, EOI は length がなく payload もない。SOS は length がなく ff00 以外の ff?? が来るまで scan し続ける(ので、これを真面目にやると重たい)
- 資料) http://pwiki.awm.jp/~yoya/?JPEG
- dump実行例
~/svn/IO_SWF% php sample/jpeg_dump.php dump orz.jpg SOI: APP0: length=14 md5=6231819e4c55dc62557f1cda73329e99 DQT: length=65 md5=d0eaa368737f17f6037757d393a22599 DQT: length=65 md5=0ccab5367a4a1a6b9d4f5dc5b1b6da3f SOF0: length=15 md5=c83e80b171b05e3d1daaecc9f7a9d4b2 DHT: length=26 md5=c30a44c47fc7a3bf3dc08b0d0c16cb24 DHT: length=54 md5=ad4a54e8cffc484a1d57d8b9619159e8 DHT: length=21 md5=f5142d552f32b0fd9b6f01287d6187cd DHT: length=27 md5=5340e2d349d844450c870b9a37698f85 SOS: length=1945 md5=8003cab9c3564d49fb37d5f4a30d8a1e EOI: