3D技術研究所Wiki > テクスチャ > TGA画像フォーマット詳細

TGA(Targa)画像フォーマットの詳細をまとめています。

情報

このページはTGA画像フォーマットの詳細について解説しています。
ご自身のアプリケーションにTGA画像を組み込みたい場合はTGAReaderをご覧ください。

目次


TGA画像豆知識

  • カラーマップイメージとはインデックスカラーイメージ/カラーパレットイメージと同等です
  • カラーマップデータとはインデックスカラーデータ/カラーパレットデータと同等です
  • 白黒イメージとはグレースケールイメージと同等です
  • カラーは基本BGR(A)の順で格納されています

TGA画像ヘッダー

TGAのヘッダーは18Byte固定です。

オフセット(Byte)長さ(Byte)説明
01IDフィールド長
11カラーマップタイプ(カラーマップの有無)
21画像タイプ
32カラーマップ原点
※GIMPでは対応されていません
52カラーマップ長
71カラーマップ深度(カラーマップエントリーサイズ)
82画像X方向原点
※GIMP/WindowsExploreとも対応されていません
102画像Y方向原点
※GIMP/WindowsExploreとも対応されていません
122画像幅
142画像高さ
161画像深度(画像ピクセルサイズ)
171画像デスクリプタ
18...データ開始
画像タイプTGAReader対応説明
0×イメージデータ無し
1カラーマップイメージ
2RGBカラーイメージ
3白黒イメージ
9ランレングス圧縮カラーマップイメージ
10ランレングス圧縮RGBカラーイメージ
11ランレングス圧縮白黒イメージ
32×カラーマップデータをハフマン/デルタ/ランレングス圧縮?
33×カラーマップデータをハフマン/デルタ/ランレングス圧縮?
4パス4分木処理?
画像デスクリプタビットマスク説明
000011110x0Fアルファチャンネル深度
000100000x10X方向格納方法
0: 左から右方向
1: 右から下方向
001000000x20Y方向格納方法
0: 下から上方向
1: 上から下方向
110000000xC0インターリーブフラグ

バイナリエディタでヘッダー部を見ると以下の通り(4x4 RGB 24bitイメージ) TODO(tga_header.png)

TGAファイルをbyte配列に読み込むサンプルコード

1
2
3
4
5
6
    String path = "C:/test/test.tga";
    File file = new File(path);
    byte [] buffer = new byte[(int)file.length()];
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    bis.read(buffer);
    bis.close();

TGAヘッダーを解析するサンプルコード

1
2
3
4
5
6
7
8
9
10
11
12
    int idFieldLength = buffer[0] & 0xFF;
    int colormapType = buffer[1] & 0xFF;
    int type = buffer[2] & 0xFF;
    int colormapOrigin = buffer[3] & 0xFF | (buffer[4] & 0xFF) << 8;
    int colormapLength = buffer[5] & 0xFF | (buffer[6] & 0xFF) << 8;
    int colormapDepth = buffer[7] & 0xFF;
    int originX = buffer[8] & 0xFF | (buffer[9] & 0xFF) << 8;
    int originY = buffer[10] & 0xFF | (buffer[11] & 0xFF) << 8;
    int width = buffer[12] & 0xFF | (buffer[13] & 0xFF) << 8;
    int height = buffer[14] & 0xFF | (buffer[15] & 0xFF) << 8;
    int depth = buffer[16] & 0xFF;
    int descriptor = buffer[17] & 0xFF;

TGA画像フッター

フッターは大した情報がないので割愛します。

TGA画像データ詳細

カラーマップイメージ

  • カラーマップイメージ(画像タイプ1or9)の場合はイメージデータの前にカラーマップデータがある
  • カラーマップデータはヘッダーの後にあるので開始オフセットは18
  • カラーマップデータはランレングス圧縮されない(画像タイプ32,33は不明)
  • カラーマップ深度はアルファ付きの場合は32, RGBのみの場合は24
  • カラーマップパレットのサイズはカラーマップ深度/8 * カラーマップ長

    イメージデータまでのオフセット計算サンプルコード

    1
    2
    3
    
        int colormapDataSize = カラーマップ深度/8 * カラーマップ長;
        int colormapDataOffset = 18;
        int imageDataOffset = colormapDataOffset + colormapDataSize;

    1ピクセル目を処理するサンプルコード

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
        byte [] buffer = TGAデータ;
    
        int offset = (buffer[imageDataOffset] & 0xFF) - colormapOrigin;
    
        int color = 0xFFFFFFFF;
    
        if(offset >= 0) {
            int index = colormapDataOffset + 4*offset;
    
            int b = buffer[index+0] & 0xFF;
            int g = buffer[index+1] & 0xFF;
            int r = buffer[index+2] & 0xFF;
            int a = buffer[index+3] & 0xFF;
    
            color = (a<<24) | (r<<16) | (g<<8) | b;
        }

RGBカラーイメージ

  • 画像深度が24の場合BGR, 32の場合BGRA

    イメージデータまでのオフセット計算サンプルコード

    1
    
        int imageDataOffset = 18;

    1ピクセル目を処理するサンプルコード

    1
    2
    3
    4
    5
    6
    7
    8
    
        byte [] buffer = TGAデータ;
    
        int b = buffer[imageDataOffset+0] & 0xFF;
        int g = buffer[imageDataOffset+1] & 0xFF;
        int r = buffer[imageDataOffset+2] & 0xFF;
        int a = buffer[imageDataOffset+3] & 0xFF;
    
        int color = (a<<24) | (r<<16) | (g<<8) | b;

白黒イメージ

  • 白黒カラーはC(1Byte)で格納されBGRをCCCで表現します
  • アルファ付き白黒カラーはCAの順で格納されBGRAをCCCAで表現します

    イメージデータまでのオフセット計算サンプルコード

    1
    
        int imageDataOffset = 18;

    1ピクセル目を処理するサンプルコード

    1
    2
    3
    4
    5
    6
    
        byte [] buffer = TGAデータ;
    
        int c = buffer[imageDataOffset+0] & 0xFF;
        int a = buffer[imageDataOffset+1] & 0xFF;
    
        int color = (a<<24) | (c<<16) | (c<<8) | c;

ランレングス圧縮(RLE)

ランレングス圧縮されているデータは最初の1Byteがコントロールパケットになります。

コントロールパケットマスク説明
100000000x801:ランレングス圧縮されたデータ
0:生データ
011111110x7Fこの値に1を足した数分データを処理します

その後に色要素が続きます。 これをイメージデータ分だけ繰り返し処理します。

バイト列説明
RLE 24bitRGBカラー0xFF 0x00 0x00 0xFF赤が128ピクセル続くデータ
RLE 24bit白黒カラー0x87 0xFF 0x00 0x00白が8ピクセル、その後に黒が1ピクセル続くデータ

※紫色のバイトがコントロールパケットになります
※その他の色のバイトは各色要素になります

仕掛けが分かったところでデコード処理に移りましょう。 RLEビットが1の場合は色要素が複数続きますので要素を保存しておくバッファを確保します。 色要素数は 画像深度 / 8 で求められます。 デコード用のバッファも確保します。 デコードバッファサイズは 色要素数 * 画像幅 * 画像高さ で計算できます。

色要素バッファ、デコードバッファ作成サンプルコード

1
2
3
4
5
6
7
    // 色要素バッファ
    int elementCount = depth / 8;
    byte [] elements = new byte[elementCount];

    // デコードバッファ
    int decodeBufferLength = elementCount * width * height;
    byte [] decodeBuffer = new byte[decodeBufferLength];

実際にデコードする関数です 画像タイプ問わずRLE圧縮されているデータはすべてこの関数でデコードできます

RLEをデコードするサンプルメソッド

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
byte [] decodeRLE(int width, int height, int depth, byte [] buffer, int offset) {
    int elementCount = depth/8;
    byte [] elements = new byte[elementCount];
    int decodeBufferLength = elementCount * width * height;
    byte [] decodeBuffer = new byte[decodeBufferLength];
    int decoded = 0;
    while(decoded < decodeBufferLength) {
        int packet = buffer[offset++] & 0xFF;
        if((packet & 0x80) != 0) { // RLE
            for(int i=0; i<elementCount; i++) {
                elements[i] = buffer[offset++];
            }
            int count = (packet&0x7F)+1;
            for(int i=0; i<count; i++) {
                for(int j=0; j<elementCount; j++) {
                    decodeBuffer[decoded++] = elements[j];
                }
            }
        }
        else { // RAW
            int count = (packet+1) * elementCount;
            for(int i=0; i<count; i++) {
                decodeBuffer[decoded++] = buffer[offset++];
            }
        }
    }
    return decodeBuffer;
}

TGA画像ソースコード

こちらをご覧ください。

Java

https://github.com/npedotnet/TGAReader/blob/master/src/java/TGAReader.java

C

https://github.com/npedotnet/TGAReader/blob/master/src/c/tga_reader.h
https://github.com/npedotnet/TGAReader/blob/master/src/c/tga_reader.c


関連ページ


スポンサードリンク

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS