PNGはDEFLATEという圧縮アルゴリズムを採用している。
◆DEFLATEはBlockというデータのまとまりからなる。
[ Block ]
[ Block ]
[ Block ]
:
:
Blockの大きさに制限はない。
Blockはひとつでもよい。
◆Blockの構成
各Blockは、[ HEADER ][ DATA ] からなる。
◆ビット列とデータストリームの方向
各バイトのLSBから読み出す。
例)63 60 20... の場合
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
:
:
◆読み出したビットの連結方向
ハフマン符号はMSBからLSBに向かってぶら下げていく。
1
11
110
1100
11000
110001
1100011
11000110
:
ヘッダや拡張ビットはLSBからMSBに向かって積み上げていく。
1
11
011
0011
00011
:
◆HEADER …3ビット
最初の1ビット …最後のブロックかどうか
0 …ブロックは続く
1 …最後のブロック
残りの2ビット …圧縮の種類
00 …無圧縮
01 …固定ハフマン符号
10 …ダイナミックハフマン符号
11 …無効(将来のための予約)
◆HEADERの実際
例)0x63(01100011)というバイトから読み始める場合
LSBからビットを取り出し、LSBから並べるので、
01100011
1 …最後のブロックである
01100011
01 …固定ハフマン符号
◆DEFLATEはBlockというデータのまとまりからなる。
[ Block ]
[ Block ]
[ Block ]
:
:
Blockの大きさに制限はない。
Blockはひとつでもよい。
◆Blockの構成
各Blockは、[ HEADER ][ DATA ] からなる。
◆ビット列とデータストリームの方向
各バイトのLSBから読み出す。
例)63 60 20... の場合
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
01100011 01100000 00100000 ...
:
:
◆読み出したビットの連結方向
ハフマン符号はMSBからLSBに向かってぶら下げていく。
1
11
110
1100
11000
110001
1100011
11000110
:
ヘッダや拡張ビットはLSBからMSBに向かって積み上げていく。
1
11
011
0011
00011
:
◆HEADER …3ビット
最初の1ビット …最後のブロックかどうか
0 …ブロックは続く
1 …最後のブロック
残りの2ビット …圧縮の種類
00 …無圧縮
01 …固定ハフマン符号
10 …ダイナミックハフマン符号
11 …無効(将来のための予約)
◆HEADERの実際
例)0x63(01100011)というバイトから読み始める場合
LSBからビットを取り出し、LSBから並べるので、
01100011
1 …最後のブロックである
01100011
01 …固定ハフマン符号
コメント