TGA ファイルフォーマット

TGA (Truevision Graphics Adapter) ファイルフォーマットについて。
ビットマップファイルと同じような構造である。
ピクセルデータが圧縮されている場合は、展開する必要がる。
展開されたピクセルデータは、ビットマップと同様に、BGR の順に並んでおり、上下反対になっている。

フォーマット

ブロック オフセット サイズ内容
ヘッダー 0 18 1 ヘッダーの後に続く、IDの長さ
1 1 カラーマップの有無
2 1 データ形式
3 2 カラーマップの位置
5 2 カラーマップの長さ
7 1 カラーマップエントリーのビット数
8 2 X
10 2 Y
12 2
14 2 高さ
16 1 ピクセルのビット数
17 1 属性
ID 18 不定 ID
データ 不定 不定 ピクセルデータ
フッター 不定 26 4 拡張データのポジション
4 デベロッパーデータのポジション
18 文字列
※構造体を定義する場合は、パッキングサイズを1バイト単位にする必要がある。

データ形式

ビット圧縮 概要
0 0000,0000n/a イメージなし
1 0000,0001なし カラーマップ
2 0000,0010なし フルカラー
3 0000,0011なし 白黒
9 0000,1001連長圧縮 カラーマップ
10 0000,1010連長圧縮 フルカラー
11 0000,1011あり 白黒
32 0010,0000ハフマン符号化、差分符号化、連長圧縮 カラーマップ
33 0010,0001ハフマン符号化、差分符号化、連長圧縮 カラーマップ、四分木形式

連長圧縮(ランレングス圧縮、RLE : Run Length Encoding)

ピクセルデータの最初の1バイトが、ランレングスパケットである。
ランレングスパケットの上位1ビットが、ランレンスグスチャンクかどうかのフラグ、下位7ビットが、ピクセルの繰り返し数である。
次に、最初のピクセルデータが続く。
ランレングスチャンクであれば、次のチャンクのデータが続く。
通常チャンクであれば、ピクセルの繰り返し数だけピクセルデータが続き、次のチャンクへ続く。

次の例は、32ビットの不透明の赤いピクセルが4つ並んだ、未圧縮のピクセルデータである。
0xff0x000x000xff
0xff0x000x000xff
0xff0x000x000xff
0xff0x000x000xff

これが、ランレングスチャンクであれば、次のようになる。
0x83
0xff0x000x000xff
最初の 0x83 は、上位1ビットが1なので、ランレングスチャンクを示す。
下位7ビットの3は、最初のピクセルを3回繰り返す事を示す。

通常チャンクであれば、次のようになる。
0x03
0xff0x000x000xff
0xff0x000x000xff
0xff0x000x000xff
0xff0x000x000xff
最初の0x03は、上位1ビットが0なので、通常チャンクを示す。
下位7ビットの3は、最初のピクセルの後に、3つのピクセルデータが続く事を示す。
© GPU (Game Programming Unit) <script><!-- var fc2footerparam = 'charset=' + encodeURIComponent(document.charset ? document.charset : document.characterSet) + '&url=' + encodeURIComponent(document.location) + '&service=0&r=' + Math.floor(Math.random()*99999999999); var fc2footertag = "//vip.chps-api.fc2.com/apis/footer/?" + fc2footerparam; var script = document.createElement('script'); script.src = fc2footertag; script.charset = "UTF-8"; script.async = true; document.getElementsByTagName('head')[0].appendChild(script); //--></script> <!-- FC2, inc.--> <img src="//media.fc2.com/counter_img.php?id=50" style="visibility:hidden" alt="inserted by FC2 system" width="0" height="0"> <!-- FC2, inc.-->