标记图形(TGA )文件TGA是美国Truevision公司为图形卡开发的图像文件格式,已被国际图形产业所接受。 它现在已成为数字化图像和使用光线跟踪算法生成的高质量图像的通用格式。 TGA文件的扩展名为. TGA。 TGA结构比较简单,是图形、图像数据的通用格式,目前大多数文件都是24位或32位真彩色,在多媒体领域有很大的影响。 由于Truevision公司将TGA用于收集和输出电视图像,因此TGA文件始终按行存储并按行压缩。 因此,它也成为计算机生成图像并将其转换为电视的首选格式。 使用photoshop软件可以打开这样的文件。 结构TGA结构比较简单,是图形、图像数据的通用格式,在多媒体领域有很大的影响,是计算机生成图像并转换为电视的首选格式。 特征TGA图像格式的最大特征是能够创建不规则形状的图形、图像文件。 一般的图形、图像文件为四边形,但是需要圆形、菱形甚至有条纹的图像文件时,TGA会很有用。 优点TGA格式支持压缩,并使用无失真压缩算法。 在工业设计领域,使用三维软件创建的图像利用TGA格式的优点,可以在图像内部生成alpha (通道),该功能使平板软件的工作更加方便。
Tga的常见格式有两种:未压缩RGB和压缩RGB,其中文件的第三个字节用作标记。 2为未压缩RGB格式,10为压缩RGB格式。 这里的类只允许读取未压缩格式的tga文件。
首先给出了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
图像宽度(以像素为单位的整数(低-高) )
每像素的内存占用位数
1
62
它的值为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)
代码如下:
//========================================================/*** @file TGALoader.h** 项目描述: TGA文件载入类* 文件描述: 纹理映射 * 适用平台: Windows98/2000/NT/XP* **/ //========================================================#ifndef __TGALOADER_H__#define __TGALOADER_H__#include "stdafx.h"/** TGA文件载入类 */class CTGALoader{ public: CTGALoader(); /**< 构造函数 */ ~CTGALoader(); bool LoadTGA(const char *file); /**< 载入TGA文件 */ void FreeImage(); /**< 释放内存 */ bool Load(const char* fileName); /**< 载入TGA文件为纹理 */ unsigned int ID; /**< 生成纹理的ID号 */ int imageWidth; /**< 图像宽度 */ int imageHeight; /**< 图像高度 */ unsigned char *image; /**< 指向图像数据的指针 */ unsigned int type; /**< 图象类型GL_RGB 或GL_RGBA */};#endif //========================================================/*** @file TGALoader.cpp** 项目描述: 纹理映射* 文件描述: TGA文件载入 * 适用平台: Windows98/2000/NT/XP* **/ //========================================================#include "TGALoader.h"/** 构造函数 */CTGALoader::CTGALoader(){ /** 设置为默认值 */ image = 0; type = 0; ID = -1; imageWidth = 0; imageHeight = 0;}/** 析构函数 */CTGALoader::~CTGALoader(){ FreeImage(); /**< 释放内存 */}/** 载入TGA文件 */bool CTGALoader::LoadTGA(const char* file){ FILE *pfile; unsigned char tempColor; /**< 用于交换颜色分量 */ unsigned char bitCount; /**< 每象素的bit位数 */ int colorMode; /**< 颜色模式 */ long tgaSize; /**< TGA文件大小 */ unsigned char unCompressHeader[12] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /**< 未压缩TGA文件头 */ unsigned char tgaHeader[12]; /**< 文件头 */ unsigned char header[6]; /**< 文件头前6个字节 */ /** 检查文件名是否为空 */ if(!file) return false; /** 打开文件 */ pfile = fopen(file, "rb"); if(!pfile) return false; /** 读取文件头前12个字节 */ fread(tgaHeader, 1, sizeof(tgaHeader), pfile); /** 比较文件是否为未压缩文件 */ if(memcmp(unCompressHeader, tgaHeader, sizeof(unCompressHeader)) != 0) { MessageBox(NULL,"文件类型错误!","错误",MB_OK); fclose(pfile); return false; } /** 读取6个字节(从上面读取的12个字节后再取6个字节) */ fread(header, 1, sizeof(header), pfile); /** 计算图像的宽度和高度 */ imageWidth = header[1] * 256 + header[0]; imageHeight = header[3] * 256 + header[2]; /** 获取每象素的bit位数 */ bitCount = header[4]; /** 计算颜色模式和图像大小 */ colorMode = bitCount / 8; tgaSize = imageWidth * imageHeight * colorMode; /** 分配内存 */ image = new unsigned char[sizeof(unsigned char) * tgaSize]; /** 读取数据 */ fread(image, sizeof(unsigned char), tgaSize, pfile); /** 将BGA格式转化为RGA格式 */ for(long index = 0; index < tgaSize; index += colorMode) { tempColor = image[index]; image[index] = image[index + 2]; image[index + 2] = tempColor; } /** 关闭文件 */ fclose(pfile); /** 设置图象类型 */ if(colorMode == 3) type = GL_RGB; else type = GL_RGBA; return true;}/** 载入TGA文件并创建纹理 */bool CTGALoader::Load(const char* fileName){ if(!LoadTGA(fileName)) { MessageBox(NULL,"载入TGA文件失败!","错误",MB_OK); exit(0); } /** 生成纹理对象名称 */ glGenTextures(1, &ID); /** 创建纹理对象 */ glBindTexture(GL_TEXTURE_2D, ID); /** 控制滤波 */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); /** 创建纹理 */ gluBuild2DMipmaps(GL_TEXTURE_2D, type, imageWidth, imageHeight, type, GL_UNSIGNED_BYTE, image); return true;}void CTGALoader::FreeImage(){ /** 释放内存 */ if(image) { delete[] image; image = 0; }}