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