tga文件解析「建议收藏」
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) |
||
代碼如下:
- //========================================================
- /**
- *@fileTGALoader.h
- *
- *項(xiàng)目描述:TGA文件載入類
- *文件描述:紋理映射
- *適用平臺(tái):Windows98/2000/NT/XP
- *
- *
- */
- //========================================================
- #ifndef__TGALOADER_H__
- #define__TGALOADER_H__
- #include“stdafx.h”
- /**TGA文件載入類*/
- classCTGALoader
- {
- public:
- CTGALoader();/**<構(gòu)造函數(shù)*/
- ~CTGALoader();
- boolLoadTGA(constchar*file);/**<載入TGA文件*/
- voidFreeImage();/**<釋放內(nèi)存*/
- boolLoad(constchar*fileName);/**<載入TGA文件為紋理*/
- unsignedintID;/**<生成紋理的ID號(hào)*/
- intimageWidth;/**<圖像寬度*/
- intimageHeight;/**<圖像高度*/
- unsignedchar*image;/**<指向圖像數(shù)據(jù)的指針*/
- unsignedinttype;/**<圖象類型GL_RGB或GL_RGBA*/
- };
- #endif
- //========================================================
- /**
- *@fileTGALoader.cpp
- *
- *項(xiàng)目描述:紋理映射
- *文件描述:TGA文件載入
- *適用平臺(tái):Windows98/2000/NT/XP
- *
- *
- */
- //========================================================
- #include“TGALoader.h”
- /**構(gòu)造函數(shù)*/
- CTGALoader::CTGALoader()
- {
- /**設(shè)置為默認(rèn)值*/
- image=0;
- type=0;
- ID=-1;
- imageWidth=0;
- imageHeight=0;
- }
- /**析構(gòu)函數(shù)*/
- CTGALoader::~CTGALoader()
- {
- FreeImage();/**<釋放內(nèi)存*/
- }
- /**載入TGA文件*/
- boolCTGALoader::LoadTGA(constchar*file)
- {
- FILE*pfile;
- unsignedchartempColor;/**<用于交換顏色分量*/
- unsignedcharbitCount;/**<每象素的bit位數(shù)*/
- intcolorMode;/**<顏色模式*/
- longtgaSize;/**<TGA文件大小*/
- unsignedcharunCompressHeader[12]={0,0,2,0,0,0,0,0,0,0,0,0};/**<未壓縮TGA文件頭*/
- unsignedchartgaHeader[12];/**<文件頭*/
- unsignedcharheader[6];/**<文件頭前6個(gè)字節(jié)*/
- /**檢查文件名是否為空*/
- if(!file)
- returnfalse;
- /**打開(kāi)文件*/
- pfile=fopen(file,“rb”);
- if(!pfile)
- returnfalse;
- /**讀取文件頭前12個(gè)字節(jié)*/
- fread(tgaHeader,1,sizeof(tgaHeader),pfile);
- /**比較文件是否為未壓縮文件*/
- if(memcmp(unCompressHeader,tgaHeader,sizeof(unCompressHeader))!=0)
- {
- MessageBox(NULL,”文件類型錯(cuò)誤!”,”錯(cuò)誤”,MB_OK);
- fclose(pfile);
- returnfalse;
- }
- /**讀取6個(gè)字節(jié)(從上面讀取的12個(gè)字節(jié)后再取6個(gè)字節(jié))*/
- fread(header,1,sizeof(header),pfile);
- /**計(jì)算圖像的寬度和高度*/
- imageWidth=header[1]*256+header[0];
- imageHeight=header[3]*256+header[2];
- /**獲取每象素的bit位數(shù)*/
- bitCount=header[4];
- /** 計(jì)算顏色模式和圖像大小*/
- colorMode=bitCount/8;
- tgaSize=imageWidth*imageHeight*colorMode;
- /**分配內(nèi)存*/
- image=newunsignedchar[sizeof(unsignedchar)*tgaSize];
- /**讀取數(shù)據(jù)*/
- fread(image,sizeof(unsignedchar),tgaSize,pfile);
- /**將BGA格式轉(zhuǎn)化為RGA格式*/
- for(longindex=0;index<tgaSize;index+=colorMode)
- {
- tempColor=image[index];
- image[index]=image[index+2];
- image[index+2]=tempColor;
- }
- /**關(guān)閉文件*/
- fclose(pfile);
- /**設(shè)置圖象類型*/
- if(colorMode==3)
- type=GL_RGB;
- else
- type=GL_RGBA;
- returntrue;
- }
- /**載入TGA文件并創(chuàng)建紋理*/
- boolCTGALoader::Load(constchar*fileName)
- {
- if(!LoadTGA(fileName))
- {
- MessageBox(NULL,”載入TGA文件失敗!”,”錯(cuò)誤”,MB_OK);
- exit(0);
- }
- /**生成紋理對(duì)象名稱*/
- glGenTextures(1,&ID);
- /**創(chuàng)建紋理對(duì)象*/
- glBindTexture(GL_TEXTURE_2D,ID);
- /**控制濾波*/
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
- /**創(chuàng)建紋理*/
- gluBuild2DMipmaps(GL_TEXTURE_2D,type,imageWidth,
- imageHeight,type,GL_UNSIGNED_BYTE,
- image);
- returntrue;
- }
- voidCTGALoader::FreeImage()
- {
- /**釋放內(nèi)存*/
- if(image)
- {
- delete[]image;
- image=0;
- }
- }
總結(jié)
以上是生活随笔為你收集整理的tga文件解析「建议收藏」的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 教你PSD文件如何预览(支持32以及64
- 下一篇: OpenWRT rootfs 的生成过程