当前位置:

首页 > 编程开发 > c++如何解析TGA格式图像数据_未压缩与RLE压缩读取【实战】

c++如何解析TGA格式图像数据_未压缩与RLE压缩读取【实战】

TGA图像数据解析关键在于文件头第17字节:值为2表示RLE压缩,0为未压缩,老版本可能为3。未压缩图像需处理每行32位对齐填充,RLE解码根据包头最高位区分重复包与原样包。需注意alpha通道提取及图像方向翻转(descriptor字节bit5决定原点)。

TGA文件是否启用RLE压缩,这个问题其实没那么复杂,关键就在文件头的第17个字节(从0开始数)的低4位上。如果这个值是10(也就是十进制的2),那就是RLE压缩;如果是0,那肯定是未压缩的。别被文件扩展名骗了——很多工具导出TGA时默认开着RLE,但真正靠谱的判断依据,只有头信息。

c++如何解析TGA格式图像数据_未压缩与RLE压缩读取【实战】

实际动手时,有几点可以多留意:用fread(header, 1, 18, fp)读取前18个字节,然后直接检查header[17]。TGA虽然是常见的小端序,但这个字段就一个字节,所以不用考虑字节序的问题。另外,有些老版本的工具(比如Paint Shop Pro)可能会把RLE标记写成11(也就是3),遇到这种情况,不妨先按RLE逻辑尝试解码,再校验一下解码后的像素总数是否和width * height * bytes_per_pixel匹配,这样就能确认了。

接下来说说未压缩TGA的读取。TGA默认是按BGR顺序存储的,而且每行的字节数必须是4的倍数,也就是32位对齐。举个例子,如果图片宽度是137像素,24位色(每个像素3字节),那一行原始数据应该是137 * 3 = 411字节,但实际在文件里它会变成412字节——末尾会补一个0字节。这个填充只存在于文件里,解到内存后就不用管了。

这里有个常见的坑:计算每行的真实跨度时,可以用公式row_stride = ((width * bits_per_pixel + 31) / 32) * 4。读完一行后,用fseek(fp, row_stride - width * bytes_per_pixel, SEEK_CUR)跳过填充部分。另外,如果你要把数据转成RGB格式或者直接上传到OpenGL做纹理,最好在读的时候就直接把通道顺序重排好,别等到全部加载完再批量转换——那样很容易因为stride算错导致越界。

再来说说RLE解码。RLE包由“包头字节”和“内容字节”组成:如果包头的最高位是1(也就是值≥128),那就是重复包;否则就是原样包。低7位表示后续的字节数(范围是1到128)。很多人容易犯的一个错误是,把包头当成像素数据直接拷贝,结果整张图就变成了杂色。

为了避免死循环和越界,有几个实操建议:每次读包头之前,先检查是否已经读满了总像素数,否则fread(&packet_header, 1, 1, fp)可能失败,但你没做错误处理。重复包只需要读1次像素数据,而原样包需要读packet_header & 0x7F次——注意,这个“次数”是指像素数,不是字节数。比如24位图,就要按3字节一组来读。最好用一个size_t decoded_count = 0来累加已解码的像素数,每次循环末尾检查一下decoded_count > width * height,一旦超出就立刻报错退出。

最后聊聊alpha通道和图像方向的问题。TGA的descriptor字节(头部第16字节)里,低4位表示alpha的位数(通常是0或8),高4位的bit 5决定了图像是否上下颠倒:如果bit 5为1,表示左上角是原点;如果为0,那就表示左下角是原点——这意味着文件数据的第一行,对应的是屏幕最下面那行。

千万别硬编码做翻转。先检查header[16] & 0x20,如果结果为0,才需要对输出缓冲区做垂直翻转。提取alpha通道时也别用位移硬拆:如果bits_per_pixel == 32且header[16] & 0x0F == 8,说明有独立的alpha通道,BGR+A的顺序,直接按4字节一组取第4个字节就行。OpenCV或者stb_image这些库默认假设是左上角原点,但大多数TGA是左下角原点,所以如果你自己解析后直接送显,图一定是倒的——这一点其实比RLE更容易被忽略,得多留个心。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 C++
相关文章 更多
codekit环境配置指南从安装到环境搭建完整教程
codekit环境配置指南从安装到环境搭建完整教程

详解 CodeKit 在 macOS 下的安装步骤、项目导入方法、Sass与JavaScript编译设置及浏览器自动刷新功能,助您快速搭建高效的前端开发环境。

codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

Java 8至21新特性代码写法对比:Lambda、Record与Switch
Java 8至21新特性代码写法对比:Lambda、Record与Switch

本文通过具体的旧版与新版代码对比,详细剖析Java 8引入的Lambda表达式、Java 14/16引入的Record类,以及Java 12至21逐步演进完善的Switch表达式与模式匹配,展示代码简化路径与避坑要点。

AI智能体开发培训课程学什么及实战内容介绍
AI智能体开发培训课程学什么及实战内容介绍

系统梳理AI智能体开发培训的核心知识模块、技术栈选型与典型实战项目,解析低代码平台与纯代码框架的差异,提供从零构建可落地智能体的完整学习与实施路径。

Java子类未实现抽象方法编译错误修复指南
Java子类未实现抽象方法编译错误修复指南

针对Java开发中常见的“子类未实现抽象方法”编译错误,深入分析报错原因,提供重写实现、声明抽象子类两种标准修复路径,并总结参数签名、访问修饰符等典型避坑要点。

解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。