日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

tga文件解析「建议收藏」

發(fā)布時(shí)間:2023/12/19 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 tga文件解析「建议收藏」 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Tga常見(jiàn)的格式有非壓縮RGB和壓縮RGB兩種格式,文件的第三個(gè)Byte位作為標(biāo)記:2為非壓縮RGB格式,10為壓縮RGB格式。這里的類只實(shí)現(xiàn)讀取非壓縮格式的tga文件。

先給出tga文件的文件格式:

名稱

偏移

長(zhǎng)度

說(shuō)明

圖像信息字段長(zhǎng)度

0

1

本字段是 1 字節(jié)無(wú)符號(hào)整型,指出圖像信息字段(見(jiàn)本子表的后面)長(zhǎng)度,其取值范圍是 0 到 255 ,當(dāng)它為 0 時(shí)表示沒(méi)有圖像的信息字段。

顏色表類型

1

1

0 表示沒(méi)有顏色表,1 表示顏色表存在。由于本格式是無(wú)顏色表的,因此此項(xiàng)通常被忽略。

圖像類型碼

2

1

該字段總為 2 ,這也是此類型為格式 2 的原因。

顏色表規(guī)格字段

顏色表首址

3

2

顏色表首的入口索引,整型(低位-高位)

如果顏色表字段為0,則忽略該字段

顏色表的長(zhǎng)度

5

2

顏色表的表項(xiàng)總數(shù),整型(低位–高位)

顏色表項(xiàng)位數(shù)

7

1

位數(shù)(bit),16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA

圖像規(guī)格字段

圖像 X 坐標(biāo)起始位置

8

2

圖像左下角 X坐標(biāo)的整型(低位–高位)值

圖像 Y 坐標(biāo)起始位置

10

2

圖像左下角 Y坐標(biāo)的整型(低位–高位)值

圖像寬度

12

2

以像素為單位,圖像寬度的整型(低位–高位)

圖像高度

14

2

以像素為單位,圖像寬度的整型(低位–高位)

圖像每像素存儲(chǔ)占用位數(shù)

16

2

它的值為16,24 或 32 等等。決定了該圖像是 TGA 16,TGA24,TGA 32 等等。

圖像描述符字節(jié)

17

1

bits 3-0 – 每像素對(duì)應(yīng)的屬性位的位數(shù);

對(duì)于TGA 16,該值為 0 或 1,對(duì)于 TGA 24,該值為 0,對(duì)于 TGA 32,該值為 8。

bit 4 – 保留,必須為 0

bit 5 – 屏幕起始位置標(biāo)志

0 = 原點(diǎn)在左下角

1 = 原點(diǎn)在左上角

對(duì)于 truevision 圖像必須為 0

bits 7-6 – 交叉數(shù)據(jù)存儲(chǔ)標(biāo)志

00 = 無(wú)交叉

01 = 兩路奇/偶交叉

10 = 四路交叉

11 = 保留

圖像信息字段

18

可變

包含一個(gè)自由格式的,長(zhǎng)度是圖像由“圖像信息字段”指定。它常常被忽略(即偏移 0 處值為 0 ),注意其最大可以含有 255 個(gè)字符。如果需要存儲(chǔ)更多信息,可以放在圖像數(shù)據(jù)之后。

顏色表數(shù)據(jù)

可變

可變

如果顏色表類型為 0,則該域不存在,否則越過(guò)該域直接讀取圖像顏色表規(guī)格中描述了每項(xiàng)的字節(jié)數(shù),為 2,3,4 之一。

圖像數(shù)據(jù)

可變

可變

RGB顏色數(shù)據(jù),存放順序?yàn)椋築BB GGG RRR (AAA)

代碼如下:

  1. //========================================================
  2. /**
  3. *@fileTGALoader.h
  4. *
  5. *項(xiàng)目描述:TGA文件載入類
  6. *文件描述:紋理映射
  7. *適用平臺(tái):Windows98/2000/NT/XP
  8. *
  9. *
  10. */
  11. //========================================================
  12. #ifndef__TGALOADER_H__
  13. #define__TGALOADER_H__
  14. #include“stdafx.h”
  15. /**TGA文件載入類*/
  16. classCTGALoader
  17. {
  18. public:
  19. CTGALoader();/**<構(gòu)造函數(shù)*/
  20. ~CTGALoader();
  21. boolLoadTGA(constchar*file);/**<載入TGA文件*/
  22. voidFreeImage();/**<釋放內(nèi)存*/
  23. boolLoad(constchar*fileName);/**<載入TGA文件為紋理*/
  24. unsignedintID;/**<生成紋理的ID號(hào)*/
  25. intimageWidth;/**<圖像寬度*/
  26. intimageHeight;/**<圖像高度*/
  27. unsignedchar*image;/**<指向圖像數(shù)據(jù)的指針*/
  28. unsignedinttype;/**<圖象類型GL_RGB或GL_RGBA*/
  29. };
  30. #endif
  1. //========================================================
  2. /**
  3. *@fileTGALoader.cpp
  4. *
  5. *項(xiàng)目描述:紋理映射
  6. *文件描述:TGA文件載入
  7. *適用平臺(tái):Windows98/2000/NT/XP
  8. *
  9. *
  10. */
  11. //========================================================
  12. #include“TGALoader.h”
  13. /**構(gòu)造函數(shù)*/
  14. CTGALoader::CTGALoader()
  15. {
  16. /**設(shè)置為默認(rèn)值*/
  17. image=0;
  18. type=0;
  19. ID=-1;
  20. imageWidth=0;
  21. imageHeight=0;
  22. }
  23. /**析構(gòu)函數(shù)*/
  24. CTGALoader::~CTGALoader()
  25. {
  26. FreeImage();/**<釋放內(nèi)存*/
  27. }
  28. /**載入TGA文件*/
  29. boolCTGALoader::LoadTGA(constchar*file)
  30. {
  31. FILE*pfile;
  32. unsignedchartempColor;/**<用于交換顏色分量*/
  33. unsignedcharbitCount;/**<每象素的bit位數(shù)*/
  34. intcolorMode;/**<顏色模式*/
  35. longtgaSize;/**<TGA文件大小*/
  36. unsignedcharunCompressHeader[12]={0,0,2,0,0,0,0,0,0,0,0,0};/**<未壓縮TGA文件頭*/
  37. unsignedchartgaHeader[12];/**<文件頭*/
  38. unsignedcharheader[6];/**<文件頭前6個(gè)字節(jié)*/
  39. /**檢查文件名是否為空*/
  40. if(!file)
  41. returnfalse;
  42. /**打開(kāi)文件*/
  43. pfile=fopen(file,“rb”);
  44. if(!pfile)
  45. returnfalse;
  46. /**讀取文件頭前12個(gè)字節(jié)*/
  47. fread(tgaHeader,1,sizeof(tgaHeader),pfile);
  48. /**比較文件是否為未壓縮文件*/
  49. if(memcmp(unCompressHeader,tgaHeader,sizeof(unCompressHeader))!=0)
  50. {
  51. MessageBox(NULL,”文件類型錯(cuò)誤!”,”錯(cuò)誤”,MB_OK);
  52. fclose(pfile);
  53. returnfalse;
  54. }
  55. /**讀取6個(gè)字節(jié)(從上面讀取的12個(gè)字節(jié)后再取6個(gè)字節(jié))*/
  56. fread(header,1,sizeof(header),pfile);
  57. /**計(jì)算圖像的寬度和高度*/
  58. imageWidth=header[1]*256+header[0];
  59. imageHeight=header[3]*256+header[2];
  60. /**獲取每象素的bit位數(shù)*/
  61. bitCount=header[4];
  62. /** 計(jì)算顏色模式和圖像大小*/
  63. colorMode=bitCount/8;
  64. tgaSize=imageWidth*imageHeight*colorMode;
  65. /**分配內(nèi)存*/
  66. image=newunsignedchar[sizeof(unsignedchar)*tgaSize];
  67. /**讀取數(shù)據(jù)*/
  68. fread(image,sizeof(unsignedchar),tgaSize,pfile);
  69. /**將BGA格式轉(zhuǎn)化為RGA格式*/
  70. for(longindex=0;index<tgaSize;index+=colorMode)
  71. {
  72. tempColor=image[index];
  73. image[index]=image[index+2];
  74. image[index+2]=tempColor;
  75. }
  76. /**關(guān)閉文件*/
  77. fclose(pfile);
  78. /**設(shè)置圖象類型*/
  79. if(colorMode==3)
  80. type=GL_RGB;
  81. else
  82. type=GL_RGBA;
  83. returntrue;
  84. }
  85. /**載入TGA文件并創(chuàng)建紋理*/
  86. boolCTGALoader::Load(constchar*fileName)
  87. {
  88. if(!LoadTGA(fileName))
  89. {
  90. MessageBox(NULL,”載入TGA文件失敗!”,”錯(cuò)誤”,MB_OK);
  91. exit(0);
  92. }
  93. /**生成紋理對(duì)象名稱*/
  94. glGenTextures(1,&ID);
  95. /**創(chuàng)建紋理對(duì)象*/
  96. glBindTexture(GL_TEXTURE_2D,ID);
  97. /**控制濾波*/
  98. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  99. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  100. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  101. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  102. /**創(chuàng)建紋理*/
  103. gluBuild2DMipmaps(GL_TEXTURE_2D,type,imageWidth,
  104. imageHeight,type,GL_UNSIGNED_BYTE,
  105. image);
  106. returntrue;
  107. }
  108. voidCTGALoader::FreeImage()
  109. {
  110. /**釋放內(nèi)存*/
  111. if(image)
  112. {
  113. delete[]image;
  114. image=0;
  115. }
  116. }

總結(jié)

以上是生活随笔為你收集整理的tga文件解析「建议收藏」的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。