tga文件解析「建议收藏」

Tga常见的格式有非压缩RGB和压缩RGB两种格式,文件的第三个Byte位作为标记:2为非压缩RGB格式,10为压缩RGB格式。这里的类只实现读取非压缩格式的tga文件。先给出tga文件的文件格式:名称偏移长度说明图像信息字段长度01本字段是1字节无符号整型,指出图像信息字段

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

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.       
  20.       CTGALoader();                             /**< 构造函数 */
  21.       ~CTGALoader();
  22.       bool LoadTGA(const char *file);          /**< 载入TGA文件 */
  23.       void FreeImage();                        /**< 释放内存 */ 
  24.       bool Load(const char* fileName); /**< 载入TGA文件为纹理 */
  25.       unsigned int ID;                        /**< 生成纹理的ID号 */
  26.       int imageWidth;                         /**< 图像宽度 */
  27.       int imageHeight;                        /**< 图像高度 */
  28.       unsigned char *image;                   /**< 指向图像数据的指针 */
  29.       unsigned int type;                      /**< 图象类型GL_RGB 或GL_RGBA */
  30. };
  31. #endif
  1. //========================================================
  2. /**
  3. *  @file      TGALoader.cpp
  4. *
  5. *  项目描述: 纹理映射
  6. *  文件描述:  TGA文件载入  
  7. *  适用平台: Windows98/2000/NT/XP
  8. *  
  9. *
  10. */     
  11. //========================================================
  12. #include “TGALoader.h”
  13. /** 构造函数 */
  14. CTGALoader::CTGALoader()
  15. {
  16.   /** 设置为默认值 */
  17.   image = 0;
  18.   type = 0;
  19.   ID = -1;
  20.   imageWidth = 0;
  21.   imageHeight = 0;
  22. }
  23. /** 析构函数 */
  24. CTGALoader::~CTGALoader()
  25. {
  26.    FreeImage();           /**< 释放内存 */
  27. }
  28. /** 载入TGA文件 */
  29. bool CTGALoader::LoadTGA(const char* file)
  30. {
  31.    FILE *pfile;
  32.    unsigned char tempColor;              /**< 用于交换颜色分量 */
  33.    unsigned char bitCount;               /**< 每象素的bit位数 */
  34.    int colorMode;                        /**< 颜色模式 */
  35.    long tgaSize;                         /**< TGA文件大小 */
  36.    unsigned char unCompressHeader[12] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /**< 未压缩TGA文件头 */
  37.    unsigned char tgaHeader[12];          /**< 文件头 */
  38.    unsigned char header[6];              /**< 文件头前6个字节 */
  39.    /** 检查文件名是否为空 */
  40.    if(!file) 
  41.        return false;
  42.    
  43.    /** 打开文件 */
  44.    pfile = fopen(file, “rb”);
  45.    if(!pfile) 
  46.        return false;
  47.    /** 读取文件头前12个字节 */
  48.    fread(tgaHeader, 1, sizeof(tgaHeader), pfile);
  49.    /** 比较文件是否为未压缩文件 */
  50.    if(memcmp(unCompressHeader, tgaHeader, sizeof(unCompressHeader)) != 0)
  51.        {
  52.            MessageBox(NULL,”文件类型错误!”,”错误”,MB_OK);
  53.            fclose(pfile);
  54.            return false;
  55.        }
  56.    /** 读取6个字节(从上面读取的12个字节后再取6个字节) */
  57.    fread(header, 1, sizeof(header), pfile);
  58.    /** 计算图像的宽度和高度 */
  59.    imageWidth = header[1] * 256 + header[0];    
  60.    imageHeight = header[3] * 256 + header[2];   
  61.    /** 获取每象素的bit位数 */
  62.    bitCount = header[4];
  63.    /** 计算颜色模式和图像大小 */
  64.    colorMode = bitCount / 8;
  65.    tgaSize = imageWidth * imageHeight * colorMode;
  66.    /** 分配内存 */
  67.    image = new unsigned char[sizeof(unsigned char) * tgaSize];
  68.    /** 读取数据 */
  69.    fread(image, sizeof(unsigned char), tgaSize, pfile);
  70.    /** 将BGA格式转化为RGA格式 */
  71.    for(long index = 0; index < tgaSize; index += colorMode)
  72.        {
  73.            tempColor = image[index];
  74.            image[index] = image[index + 2];
  75.            image[index + 2] = tempColor;
  76.        }
  77.    /** 关闭文件 */
  78.    fclose(pfile);
  79.    /** 设置图象类型 */
  80.    if(colorMode == 3) 
  81.        type = GL_RGB;
  82.    else 
  83.        type = GL_RGBA;
  84.    return true;
  85. }
  86. /** 载入TGA文件并创建纹理 */
  87. bool CTGALoader::Load(const char* fileName)
  88. {
  89.     if(!LoadTGA(fileName))
  90.     {
  91.         MessageBox(NULL,”载入TGA文件失败!”,”错误”,MB_OK);
  92.         exit(0);
  93.     }
  94.     /** 生成纹理对象名称 */
  95.     glGenTextures(1, &ID);
  96.    
  97.     /** 创建纹理对象 */
  98.     glBindTexture(GL_TEXTURE_2D, ID);
  99.     
  100.     /** 控制滤波 */
  101.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  102.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  103.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  104.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  105.    
  106.     /** 创建纹理 */
  107.     gluBuild2DMipmaps(GL_TEXTURE_2D, type, imageWidth,
  108.                       imageHeight, type, GL_UNSIGNED_BYTE,
  109.                       image);
  110.    return true;
  111. }
  112. void CTGALoader::FreeImage()
  113. {
  114.    /** 释放内存 */
  115.    if(image)
  116.       {
  117.          delete[] image;
  118.          image = 0;
  119.       }
  120. }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • administrator改名字_win10改了用户名无法登录

    administrator改名字_win10改了用户名无法登录网友求助:xp用administrator_XP系统修改administrator的用户名_xpadministrator问题不想添加多一个用户的办法?????????????????最佳答案说实话没有看懂题主的要求。我只能从你题面对描述,即将高级管理员帐户“Administrator”改变成其他名字来解答。要想将WindowsXP中要将默认的系统用户名改变成其他名称是可以实现的,但是需要调用“组…

    2022年10月14日
  • CPLD与FPGA的区别

    CPLD与FPGA的区别FPGA和CPLD是两种著名的数字逻辑芯片。当涉及到内部架构时,这两种芯片显然是不同的。FPGA:现场可编程门阵列,是一种可编程逻辑芯片。它是一个伟大的芯片,因为它可以被编程去做几乎任何一种数字功能。FPGA的架构允许芯片具有很高的逻辑容量。它被用于设计要求很高的门数和它们的延迟是相当不可预测的,因为它的结构。FPGA被认为是“细粒”,因为它包含了很多可以达到10万的微小逻辑块。这是人组合逻辑和记…

    2022年5月4日
  • VS2008安装失败_vs2015安装时发生严重错误

    VS2008安装失败_vs2015安装时发生严重错误因为前两天XML的作业时用VS2008做的,公司的电脑上没装,打算装一个,以前安装过N次VS2008,昨天在公司的电脑上安装提示如下错误:    当时以为是安装的同时打开了很多其他的应用程序导致的这个问题。今天在关闭其他程序的情况下重新安装,还是出错。    在百度上搜说是与office2007冲突,解决办法是卸载office2007再安装,但是我以前都是在安装

    2022年9月6日
  • 购买部署阿里免费ssl证书的步骤「建议收藏」

    购买部署阿里免费ssl证书的步骤「建议收藏」ssl证书购买页面购买后如下点击证书申请填写证书信息下一步需要验证信息添加域名解析记录,内容是上面的截图,需要到自己的域名添加签发成功后进行部署需要一台http服务器,这里以nginx为例子,阿里有关于部署的说明文档,上面已签发右边操作中有一个下载,如下选择下载后根据帮助,找到文档如nginx的文档关于部署https服务我前面一篇文章也有记录nginx部署https服务…

    2022年10月3日
  • 使用Mxnet基于skip-gram模型实现word2vect

    1.需求使用skipgram模式实现word2vect,然后在jaychou_lyrics.txt数据集上应用jaychou_lyrics.txt数据集收录了周杰伦从第一张专辑到第十张专辑中的

    2021年12月30日
  • 复合命题及其推理答案_基本复合命题及其推理

    复合命题及其推理答案_基本复合命题及其推理复合命题,最常见和应用较广的基础推理.

    2022年8月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号