//
// TGA是一种简单、无损的图像数据文件编码格式,支持RLE(Run-Length
// Encoding,行程长度编码)压缩算法,这是一种简单的压缩算法,通过
// 将连续重复的数据编码为[repeat bit, num-1, ARGB]的形式来实现压缩。
// 数据字节序为小端模式
//
// 文件结构解析:
// size(byte)
// +--------------------------+
// 1 | ID Length (offset=0) | 字段1:表示字段6的长度byte
// +--------------------------+
// 1 | Color Map Type (1) | 字段2:颜色表类型,0-不使用颜色表,1-使用颜色表,(2-255未定义)
// +--------------------------+
// 1 | Image Type (2) | 字段3:图像类型,0-无图像数据,1-未压缩,颜色表映射图像,2-未压缩,真彩图像,3-未压缩,黑白图像
// | | 9-行程编码,颜色表映射图像,10-行程编码,真彩图像,11-行程编码,黑白图像
// +--------------------------+
// 5 | Color Map Specification (3) 字段4:颜色表说明,2byte颜色表首地址(索引),2byte颜色表长度(元素个数),byte每一个颜色大小15、16、24、32位
// +--------------------------+
// 10 | Image Specification (8) | 字段5:图像说明,2byte图像原点坐标X,2byte图像原点坐标Y,2byte图像宽度,2byte图像高度,byte图像深度即每个像素占用位数(16,24,32位)
// | | byte图像描述,0-3位表示alpha值占用的位数,4-5位标识原点位置,00左下,01右下,10左上,11右上
// +--------------------------+
// from field 1 | Image ID | 字段6:由字段1决定该字段的长度,图像描述信息(ID)
// +--------------------------+
// from field 4 | Color Map Data | 字段7:颜色表数据,长度由字段4决定,即元素个数 x 颜色大小
// +--------------------------+
// from field 5 | | 字段8:--图像数据--,这就是实际颜色数据所在的位置了,其长度由字段5决定,分为颜色索引与颜色值两种,颜色值顺序为ARGB(32位),RGB(24位),ARGB(16位)
// | | 注意:因为字节序为小端模式,所以看起来颜色值顺序是反的BGRA(32位)BGR(24位)
// | | 16位:每一个像素由2byte数据组成,其中每5位为一个颜色值,最高位为alpha值(这一个貌似很多软件都没有用,默认为0),当查看二进制数据时你需要将这2byte调换顺序才能看到正确结果)
// | Image Data | 24位:每byte为一个颜色值(不含alpha)。32位:每byte为一个颜色值
// | | 压缩格式的图像颜色表示与非压缩一样,区别在于颜色值前可能会有一个压缩标识占1byte,其最高位0表示后续字节的颜色是不重复的,1表示后续字节的颜色值是重复的
// | | 压缩标识的其他位表示重复或不重复的次数-1(因为0算一次,1算两次)
// +--------------------------+
// from field 29| Developer Fields | 字段9:开发者字段,偏移量(offset从顶部到这里的偏移字节)由字段29决定,该字段内容可以完全忽略
// +--------------------------+
// | Developer Directory | 字段10:开发者目录
// +--------------------------+
// 2 | Extension (local offset=0) 字段11:扩展区域,偏移量(offset从顶部到这里的偏移字节)由字段28决定,包含了众多该文件的信息
// +--------------------------+
// 41 | Author Name (2) | 字段12:(看字段名)
// +--------------------------+
// 324 | Author Comments (43) | 字段13:(看字段名)
// +--------------------------+
// 12 | Date/Time Stamp (367) | 字段14:(看字段名)
// +--------------------------+
// 6 | Job Name/ID (397) | 字段15:(看字段名)
// +--------------------------+
// 41 | Software ID (420) | 字段16:(看字段名)
// +--------------------------+
// 3 | Software Version (467) | 字段17:(看字段名)
// +--------------------------+
// 4 | Key Color (470) | 字段18:(看字段名)
// +--------------------------+
// 4 | Pixel Aspect Ratio (474) | 字段19:(看字段名)
// +--------------------------+
// 4 | Gamma Value (478) | 字段20:(看字段名)
// +--------------------------+
// 4 | Color Correction Offset (482) 字段21:(看字段名)
// +--------------------------+
// 4 | Postage Stamp Offset (486) 字段22:(看字段名)
// +--------------------------+
// 4 | Scan Line Offset (490) | 字段23:(看字段名)
// +--------------------------+
// 4 | Attributes Type (494) | 字段24:(看字段名)
// +--------------------------+
// | Scan Line Table | 字段25:(看字段名),由字段23决定该字段的偏移位置
// +--------------------------+
// | Postage Stamp Image | 字段26:(看字段名),由字段22决定该字段的偏移位置
// +--------------------------+
// 2000 | Color Correction Table | 字段27:(看字段名),由字段21决定该字段的偏移位置
// +--------------------------+
// 4 | Extension Area Offset | 字段28:决定字段11的偏移位置(相对于顶部),如果为0,说明该字段不存在
// +--------------------------+
// 4 | Developer Directory Offset 字段29:决定字段9的偏移位置(相对于顶部),如果为0,说明该字段不存在
// +--------------------------+
// 16 | Signature | 字段30:TGA文件签名,一般以TRUEVISION开头,例如TRUEVISION-XFILE
// +--------------------------+
// 1 | End Character | 字段31:TGA文件结束字符2E
// +--------------------------+
// 1 | End Of File | 字段32:文件结束字符0
// +--------------------------+
//
// tga图片解码的大致步骤如下:
// . 验证文件签名,确定其是一个真正的TGA文件
// . 确定图像尺寸等信息
// . 计算图像数据字段位置,这需要根据前面字段的提示确定偏移量
// . 存储图像数据原始序列(未解码的byte序列),也可以不做这一步,直接对文件进行解码
// . 对图像数据原始序列进行解码,根据像素值大小(16,24,32位)和是否压缩来进行
// . 验证解码出来的图像数据是否正确
//
//
.tga图片格式结构解析
最新推荐文章于 2024-08-26 20:36:10 发布