.tga图片格式结构解析

本文详细介绍了TGA图像文件的结构,包括RLE压缩算法、文件头中的关键字段以及解码步骤,涵盖了非压缩和压缩格式的32位图像数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//
// 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位)和是否压缩来进行
//       . 验证解码出来的图像数据是否正确
// 
//


以下是4x4像素的32位非压缩格式2进制文件数据(未标注的是图像颜色数据),只包含文件头,尾,图像数据,一般tga文件都只包含这些信息

在这里插入图片描述

以下是4x4像素的32位压缩格式2进制文件数据

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值