FineView Software Labs




ランレングス エンコーディング (Run Length Encoding)
TIFF, TGA, IFF, SGI, BMP, PSD など、RLEは多くの画像形式で使われている 圧縮方法(エンコード)です。画像以外の分野でも広く使われています。 同じRLEでもファイル形式によって実装方法が多少異なります。 以下、制御バイトをCBYTEとします。

TGA の RLE

if ( CBYTE & 0x80 )
{
  // 最上位ビットが1のときリピート。繰り返す回数は、CBYTE & 0x7F + 1
} else {
  // 最上位ビットが0のときコピー。コピーする回数は、CBYTE+1
}

Phtoshop, TIFF, IFF(ILBM), DICOM の RLE(PackBits)

if ( CBYTE == 0x80 )
{
  // 何もしない(制御バイトが0x80のとき)
} else if ( CBYTE & 0x80 ) {
  // 最上位ビットが1のときリピート。繰り返す回数は、257 - CBYTE
} else {
  // 最上位ビットが0のときコピー。コピーする回数は、CBYTE+1
}

SGI の RLE

int Count = CBYTE & 0x7F;
if ( Count == 0 )
{
  // 何もしない(制御バイトが0x80のとき)
} else if ( CBYTE & 0x80 ) {
  // 最上位ビットが1のときコピー。コピーする回数は、Count
} else {
  // 最上位ビットが0のときリピート。繰り返す回数は、Count
}

Paint Shop Pro の RLE

int Count = CBYTE & 0x7F;
if ( Count == 0 )
{
  // 何もしない(制御バイトが0x80のとき)
} else if ( CBYTE & 0x80 ) {
  // 最上位ビットが1のときリピート。繰り返す回数は、Count
} else {
  // 最上位ビットが0のときコピー。コピーする回数は、Count
}
リピートの動作
制御バイトの次のデータ(圧縮データ)を指定回数展開する。
// TGAの場合
// 例: 83 0A -> 0A 0A 0A 0A

コピーの動作
制御バイトに続くリテラルグループをコピー。
// TGAの場合
// 例: 04 0A 0B 0C 0D 0E -> 0A 0B 0C 0D 0E

※ リテラルグループ (Literal group)
リテラル = ありのままの = 生のデータ = 圧縮できなかったデータ


PackBitsの表記に誤りがあったため修正(2010.6.20)
修正前)
257 - (CBYTE & 0x7F)

修正後)
257 - CBYTE


参考
グラフィックファイルフォーマットハンドブック、その他WEBドキュメント。