TGA文件格式如下图:
|
名称 |
偏移 |
长度 |
说明 |
||
|
图像信息字段长度 |
0 |
1 |
本字段是 1 字节无符号整型,指出图像信息字段(见本子表的后面)长度,其取值范围是 0 到 255 ,当它为 0 时表示没有图像的信息字段。 |
||
|
颜色表类型 |
1 |
1 |
0 表示没有颜色表,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 |
它的值为16,24 或 32 等等。决定了该图像是 TGA 16,TGA24,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,则该域不存在,否则越过该域直接读取图像颜色表规格中描述了每项的字节数,为 2,3,4 之一。 |
||
|
图像数据 |
可变 |
可变 |
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; }
浙公网安备 33010602011771号