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