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 …固定ハフマン符号