|
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ドキュメント。
|