FineView Software Labs




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

TGA での RLE

if ( CBYTE & 0x80 )
{
  // 上位ビットが1のとき反復。次に続くデータバイトを繰り返す。
  // 繰り返す回数は、CBYTE & 0x7F + 1
  // 例: 83 0A -> 0A 0A 0A 0A
} else {
  // 上位ビットが0のとき、リテラルグループ(Literal group)が続く。
  // 制御バイトの後ろ CBYTE+1 個のデータをコピーする。
  // 例: 04 0A 0B 0C 0D 0E ->  0A 0B 0C 0D 0E
}

IFF での RLE

if ( CBYTE == 0x80 )
{
  // 制御バイトが80のときは何もしない。
} else if ( CBYTE & 0x80 ) {
  // 上位ビットが1のとき反復。次に続くデータバイトを繰り返す。
  // 繰り返す回数は、257 - (CBYTE & 0x7F)
} else {
  // 上位ビットが0のとき、リテラルグループが続く。制御バイトの後ろ
  // CBYTE+1 個のデータをコピーする。
}

SGI での RLE

int Count = CBYTE & 0x7F;
if ( Count == 0 )
{
  // 何もしない
} else if ( CBYTE & 0x80 ) {
  // 上位ビットが1のとき、リテラルグループが続く。
  // Count数コピーする
} else {
  // 上位ビットが0のとき反復。次に続くデータバイトを繰り返す。
  // Count数繰り返す。
}

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