TGA文件格式如下图:

名称

偏移

长度

说明

图像信息字段长度

0

1

本字段是 1 字节无符号整型,指出图像信息字段(见本子表的后面)长度,其取值范围是 0  255 ,当它为 0 时表示没有图像的信息字段。

颜色表类型

1

1

表示没有颜色表,表示颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。

图像类型码

2

1

该字段总为 2 ,这也是此类型为格式 2 的原因。

颜色表规格字段

颜色表首址

3

2

颜色表首的入口索引,整型(低位-高位)

如果颜色表字段为0,则忽略该字段

颜色表的长度

5

2

颜色表的表项总数,整型(低位-高位)

颜色表项位数

7

1

位数(bit),16 代表 16  TGA 24 代表 24 TGA 32 代表 32  TGA

图像规格字段

图像 X 坐标起始位置

8

2

图像左下角 X坐标的整型(低位-高位)值

图像 Y 坐标起始位置

10

2

图像左下角 Y坐标的整型(低位-高位)值

图像宽度

12

2

以像素为单位,图像宽度的整型(低位-高位)

图像高度

14

2

以像素为单位,图像宽度的整型(低位-高位)

图像每像素存储占用位数

16

2

它的值为1624  32 等等。决定了该图像是 TGA 16TGA24,TGA 32 等等。

图像描述符字节

17

1

bits 3-0 - 每像素对应的属性位的位数;

对于TGA 16,该值为 0  1,对于 TGA                     24,该值为 0,对于TGA 32,该值为 8

 

bit 4    - 保留,必须为 0

 

bit 5    - 屏幕起始位置标志

0 = 原点在左下角

1 = 原点在左上角

对于 truevision 图像必须为 0

 

bits 7-6 - 交叉数据存储标志

00 = 无交叉

01 = 两路奇/偶交叉

10 = 四路交叉

11 = 保留

图像信息字段

18

可变

包含一个自由格式的,长度是图像由“图像信息字段”指定。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以含有 255 个字符。如果需要存储更多信息,可以放在图像数据之后。

颜色表数据

可变

可变

如果颜色表类型为 0,则该域不存在,否则越过该域直接读取图像颜色表规格中描述了每项的字节数,为 23之一。

图像数据

可变

可变

RGB颜色数据,存放顺序为:BBB GGG RRR (AAA)

其中,非压缩RGB形式的TGA文件的解析伪码如下:

FILE *file = fopen(filename, "rb");
//读取前12个字符并判断其是否是指定格式,是的话文件必定为TGA格式。
    if(file == NULL || fread(TGAcompter, 1, sizeof(TGAcompter), file) !=     sizeof(TGAcompter) ||
        memcmp(TGAheader, TGAcompter, sizeof(TGAheader)) != 0 ||
//读取后6位信息,包括图片长度、宽度、格式等
        fread(header, 1, sizeof(header), file) != sizeof(header))
    {
        if(file == NULL)
        {
            return false;
        }
        else
        {
            fclose(file);
            return false;
        }
    }
    image.width = header[1] * 256 + header[0];//解析长度
    image.height = header[3] * 256 + header[2];//解析宽度
    if(image.width == 0 || image.height == 0 || (header[4] != 24 && header[4] != 32))
    {
        fclose(file);
        return false;
    }
    image.bpp = header[4];//图片格式,24为RGB,32为RGBA
    bytesPerPixel = image.bpp / 8;
    imageSize = image.width * image.height * bytesPerPixel;
    image.data = (GLubyte*)malloc(imageSize);
    if(image.data == NULL)
    {
        fclose(file);
        return false;
    }
    fread(image.data, 1, imageSize, file);
        //TGA文件中的颜色信息顺序为BGA,需要翻转为RGB
    for(int i = 0; i < imageSize; i += bytesPerPixel)
    {
        GLuint tmp = image.data[i];
        image.data[i] = image.data[i + 2];
        image.data[i + 2] = tmp;
    }