Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >tga文件解析「建议收藏」

tga文件解析「建议收藏」

作者头像
全栈程序员站长
发布于 2022-07-22 08:02:22
发布于 2022-07-22 08:02:22
1K0
举报

大家好,又见面了,我是你们的朋友全栈君。

Tga常见的格式有非压缩RGB和压缩RGB两种格式,文件的第三个Byte位作为标记: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

以像素为单位,图像宽度的整型(低位–高位)

图像每像素存储占用位数

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)

代码如下:

  1. //========================================================
  2. /**
  3. * @file TGALoader.h
  4. *
  5. * 项目描述: TGA文件载入类
  6. * 文件描述: 纹理映射
  7. * 适用平台: Windows98/2000/NT/XP
  8. *
  9. *
  10. */
  11. //========================================================
  12. #ifndef __TGALOADER_H__
  13. #define __TGALOADER_H__
  14. #include “stdafx.h”
  15. /** TGA文件载入类 */
  16. class CTGALoader
  17. {
  18. public:
  19. CTGALoader(); /**< 构造函数 */
  20. ~CTGALoader();
  21. bool LoadTGA(const char *file); /**< 载入TGA文件 */
  22. void FreeImage(); /**< 释放内存 */
  23. bool Load(const char* fileName); /**< 载入TGA文件为纹理 */
  24. unsigned int ID; /**< 生成纹理的ID号 */
  25. int imageWidth; /**< 图像宽度 */
  26. int imageHeight; /**< 图像高度 */
  27. unsigned char *image; /**< 指向图像数据的指针 */
  28. unsigned int type; /**< 图象类型GL_RGB 或GL_RGBA */
  29. };
  30. #endif
  31. //========================================================
  32. /**
  33. * @file TGALoader.cpp
  34. *
  35. * 项目描述: 纹理映射
  36. * 文件描述: TGA文件载入
  37. * 适用平台: Windows98/2000/NT/XP
  38. *
  39. *
  40. */
  41. //========================================================
  42. #include “TGALoader.h”
  43. /** 构造函数 */
  44. CTGALoader::CTGALoader()
  45. {
  46. /** 设置为默认值 */
  47. image = 0;
  48. type = 0;
  49. ID = -1;
  50. imageWidth = 0;
  51. imageHeight = 0;
  52. }
  53. /** 析构函数 */
  54. CTGALoader::~CTGALoader()
  55. {
  56. FreeImage(); /**< 释放内存 */
  57. }
  58. /** 载入TGA文件 */
  59. bool CTGALoader::LoadTGA(const char* file)
  60. {
  61. FILE *pfile;
  62. unsigned char tempColor; /**< 用于交换颜色分量 */
  63. unsigned char bitCount; /**< 每象素的bit位数 */
  64. int colorMode; /**< 颜色模式 */
  65. long tgaSize; /**< TGA文件大小 */
  66. unsigned char unCompressHeader[12] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /**< 未压缩TGA文件头 */
  67. unsigned char tgaHeader[12]; /**< 文件头 */
  68. unsigned char header[6]; /**< 文件头前6个字节 */
  69. /** 检查文件名是否为空 */
  70. if(!file)
  71. return false;
  72. /** 打开文件 */
  73. pfile = fopen(file, “rb”);
  74. if(!pfile)
  75. return false;
  76. /** 读取文件头前12个字节 */
  77. fread(tgaHeader, 1, sizeof(tgaHeader), pfile);
  78. /** 比较文件是否为未压缩文件 */
  79. if(memcmp(unCompressHeader, tgaHeader, sizeof(unCompressHeader)) != 0)
  80. {
  81. MessageBox(NULL,”文件类型错误!”,”错误”,MB_OK);
  82. fclose(pfile);
  83. return false;
  84. }
  85. /** 读取6个字节(从上面读取的12个字节后再取6个字节) */
  86. fread(header, 1, sizeof(header), pfile);
  87. /** 计算图像的宽度和高度 */
  88. imageWidth = header[1] * 256 + header[0];
  89. imageHeight = header[3] * 256 + header[2];
  90. /** 获取每象素的bit位数 */
  91. bitCount = header[4];
  92. /** 计算颜色模式和图像大小 */
  93. colorMode = bitCount / 8;
  94. tgaSize = imageWidth * imageHeight * colorMode;
  95. /** 分配内存 */
  96. image = new unsigned char[sizeof(unsigned char) * tgaSize];
  97. /** 读取数据 */
  98. fread(image, sizeof(unsigned char), tgaSize, pfile);
  99. /** 将BGA格式转化为RGA格式 */
  100. for(long index = 0; index < tgaSize; index += colorMode)
  101. {
  102. tempColor = image[index];
  103. image[index] = image[index + 2];
  104. image[index + 2] = tempColor;
  105. }
  106. /** 关闭文件 */
  107. fclose(pfile);
  108. /** 设置图象类型 */
  109. if(colorMode == 3)
  110. type = GL_RGB;
  111. else
  112. type = GL_RGBA;
  113. return true;
  114. }
  115. /** 载入TGA文件并创建纹理 */
  116. bool CTGALoader::Load(const char* fileName)
  117. {
  118. if(!LoadTGA(fileName))
  119. {
  120. MessageBox(NULL,”载入TGA文件失败!”,”错误”,MB_OK);
  121. exit(0);
  122. }
  123. /** 生成纹理对象名称 */
  124. glGenTextures(1, &ID);
  125. /** 创建纹理对象 */
  126. glBindTexture(GL_TEXTURE_2D, ID);
  127. /** 控制滤波 */
  128. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  129. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  130. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  131. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  132. /** 创建纹理 */
  133. gluBuild2DMipmaps(GL_TEXTURE_2D, type, imageWidth,
  134. imageHeight, type, GL_UNSIGNED_BYTE,
  135. image);
  136. return true;
  137. }
  138. void CTGALoader::FreeImage()
  139. {
  140. /** 释放内存 */
  141. if(image)
  142. {
  143. delete[] image;
  144. image = 0;
  145. }
  146. }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125899.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月6,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
cocos2dx的图片载入「建议收藏」
对于非mipmaps的贴图直接指定为已mipmapsNum为1的形式进行初始化就可以,纹理纹理渲染完毕就可以增加到显示队列,当然这里仅仅是先简介下,关于渲染流程等我写完图片的解码部分再回来补充~
全栈程序员站长
2022/07/10
6100
如何使用OpenGL渲染YUV数据
本篇文章主要描述如何使用OpenGL ES来渲染i420(YUV420P)和nv21(YUV420SP)
雪月清
2020/06/23
6.8K0
tga文件格式(波形声音文件格式)
Tga常见的格式有非压缩RGB和压缩RGB两种格式,文件的第三个Byte位作为标记:2为非压缩RGB格式,10为压缩RGB格式。这里的类只实现读取非压缩格式的tga文件。
全栈程序员站长
2022/07/25
1.5K0
OPengL ES _ 着色器_实战1
1.由于着色器编译 链接过程较为繁琐,我封装了一下,文件名为"OSShaderManager.h" 和"OSShaderManager.m" 如果你对着色器程序加载过程不熟悉请参考OpenGL ES _ 着色器 _ 程序 代码:
酷走天涯
2018/09/14
5810
OPengL ES _ 着色器_实战1
NDK OpenGLES3.0 开发(五):FBO 离屏渲染
FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO)。
字节流动
2020/06/03
2.2K0
OpenGL(九)-- 综合案例(公、自转)OpenGL(九)-- 综合案例(公、自转)
这篇文章中会省略一部分基本的初始化代码,而且代码都是按模块进行了分割,如果想要了解可以去另一篇文章中了解一下OpenGL (三)--一个"HelloWorld"的执行全过程,也可以直接下载源码来看github
用户8893176
2021/08/09
1.2K0
OpenGL(九)-- 综合案例(公、自转)OpenGL(九)-- 综合案例(公、自转)
用OpenGL进行立方体表面纹理贴图
一、目的 掌握OpenGL中纹理对象的创建、绑定与使用方法。 二、简单介绍 1,连接静态库 #pragma comment(lib, "glut32.lib") #pragma comment(lib, "glaux.lib") 2,载入位图图像到内存(这是固定用法) AUX_RGBImageRec *LoadBMP(CHAR *Filename) { FILE *File = NULL; // 文件句柄 if (!Filename) // 确保文件名已提供
Zoctopus
2018/06/04
2.3K0
OpenGL3D迷宫场景设计「建议收藏」
最近学习用opengl库来构建一个3D场景,以及实现场景漫游、粒子系统等效果,最终算是是做了一个3D走迷宫游戏吧。感觉最近学了好多东西,所以有必要整理整理。
全栈程序员站长
2022/09/06
1.1K0
OpenGL3D迷宫场景设计「建议收藏」
NeNe opengl 纹理映射
#include "stdafx.h" #include <windows.h> // Windows的头文件 #include<stdio.h> //#include <gl/glew.h> // 包含最新的gl.h,glu.h库 //#include <gl/glut.h> // 包含OpenGL实用库 #include <gl/glaux.h> // GLaux库的头文件 //#include<gl/GLU.h> #pragma comment(lib, "open
流川疯
2019/01/17
8280
NDK OpenGLES 3.0 开发(三):YUV 渲染
前面文章一文掌握 YUV 图像的基本处理介绍了 YUV 常用的基本格式,本文以实现 NV21/NV12 的渲染为例。
字节流动
2020/06/03
2K0
OpenGL显示图片
最近想用C++在windows下实现一个基本的图像查看器功能,目前只想到了使用GDI或OpenGL两种方式。由于实在不想用GDI的API了,就用OpenGL的方式实现了一下基本的显示功能。
charlee44
2022/05/05
3.8K0
OpenGL显示图片
二维纹理映射(2D textures)【转】
http://blog.csdn.net/wangdingqiaoit/article/details/51457675
jerrypxiao
2021/02/22
1.4K0
二维纹理映射(2D textures)【转】
用OpenGL实现动态的立体时钟
(在学期末做的图形学课程设计,特将学习心得整理如下) 一、设计思路 1,设计一个平面的时钟; 按照 钟面——>中心点——>刻度——>时针——>分针——>秒针 的顺序绘制。 2,利用纹理贴图的知识使平面时钟变成立体的时钟; 3,设置键盘交互; 4,测试,修改,整理代码。 二、部分代码设计 1,键盘交互 void keyboard(unsigned char key, int x, int y) { switch (key) { case 'x': //当按下键盘上d时,以沿X轴旋
Zoctopus
2018/06/04
3.2K0
iOS-使用coreGraphics进行图片解压缩iOS-使用coreGraphics进行图片解压缩
{ //1.将UIImage转为CGImage CGImageRef ref = [UIImage imageNamed:picName].CGImage; //判断图片是否获取成功 if (!ref) { NSLog(@"Failed to load image %@", picName); return NO; } //2.读取图片大小、颜色空间 size_t width = CGImageGetWidth
用户8893176
2021/08/09
6290
OpenGL进行简单的通用计算实例
博主作为OpenGL新手,最近要用OpenGL进行并行的数据计算,突然发现这样的资料还是很少的,大部分资料和参考书都是讲用OpenGL进行渲染的。好不容易找到一本书《GPGPU编程技术,从OpenGL、CUDA到OpenCL》,里面对并行处理的发展进行了系统性的介绍,还是很不错的。小白博主很兴奋,看完书中第三章后恍然大悟了很多,就贴出书中代码3-3的例子,实现一番,并用一副图片数据做了实现。 实现环境:Window7 32bit, VS2013+OpenGL3.3+GLEW+GLFW。 OpenGL用来进行
一棹烟波
2018/01/12
2.2K0
OpenGL进行简单的通用计算实例
FFmpeg 播放器视频渲染优化
前文中,我们已经利用 FFmpeg + OpenGLES + OpenSLES 实现了一个多媒体播放器,本文将在视频渲染方面对播放器进行优化。
字节流动
2020/09/22
3.4K0
OpenGL入门
笔者最近在写安卓端OpenGL ES采集渲染摄像头的功能,恶补了一下OpenGL的相关知识,本篇权当记录。
ppchao
2020/12/02
2.8K0
OpenGL入门
OpenGL: 如何利用 Shader 实现 RGBA 到 NV21 图像格式转换?(全网首次开源)
之前写过一篇 OpenGL 使用 shader 实现 RGBA 转 YUYV 的文章,有几位读者大人在后台建议写一篇 shader 实现 RGBA 转 NV21 的文章,因为在实践中 NV21 格式用的比较多,于是我今天把这篇文章放出来。
字节流动
2021/11/01
2.9K0
OpenGL: 如何利用 Shader 实现 RGBA 到 NV21 图像格式转换?(全网首次开源)
OpenGL ES实践教程(二)摄像头采集数据和渲染
教程 这一篇教程是摄像头采集数据和渲染,包括了三部分内容,渲染部分-OpenGL ES,摄像头采集图像部分-AVFoundation和图像数据创建纹理部分-GPUImage。 核心思路 1、摄像头采集 AVFoundation的常用类介绍: AVCaptureDevice 输入设备,包括摄像头、麦克风。 AVCaptureInput 输入数据源 AVCaptureOutput 输出数据源 AVCaptureSession 会话,协调输入与输出之间的数据流 AVCaptureVideoPrevie
落影
2018/04/27
2.5K0
OpenGL ES实践教程(二)摄像头采集数据和渲染
OpenGL 使用 Shader 实现 RGBA 转 I420(附项目源码)
I420 格式的图像在视频解码中比较常见,像前面文章中提到的,在工程中一般会选择使用 Shader 将 RGBA 转 YUV,这样再使用 glReadPixels 读取图像时可以有效降低传输数据量,提升性能,并且兼容性好。
字节流动
2021/11/26
1K0
相关推荐
cocos2dx的图片载入「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档