生活随笔
收集整理的這篇文章主要介紹了
TGA文件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
TGA(Tagged Graphics)文件 TGA是由美國Truevision公司為其顯示卡開發(fā)的一種圖像文件格式,已被國際上的圖形、圖像工業(yè)所接受。現(xiàn)在已成為數(shù)字化圖像,以及運用光線跟蹤算法所產(chǎn)生的高質(zhì)量圖像的常用格式。TGA文件的擴(kuò)展名為.tga。TGA的結(jié)構(gòu)比較簡單,屬于一種圖形、圖像數(shù)據(jù)的通用格式,目前大部分文件為24位或32位真彩色,在多媒體領(lǐng)域有著很大影響。由于Truevision公司推出TGA的目的是為了采集、輸出電視圖像,所以TGA文件總是按行存儲、按行進(jìn)行壓縮的,這使得它同時也成為計算機(jī)生成圖像向電視轉(zhuǎn)換的一種首選格式。使用photoshop軟件可以打開此類文件。
結(jié)構(gòu)
TGA的結(jié)構(gòu)比較簡單,屬于一種圖形、圖像數(shù)據(jù)的通用格式,在多媒體領(lǐng)域有很大影響,是計算機(jī)生成圖像向電視轉(zhuǎn)換的一種首選格式。
特點
TGA圖像格式最大的特點是可以做出不規(guī)則形狀的圖形、圖像文件,一般圖形、圖像文件都為四方形,若需要有圓形、菱形甚至是縷空的圖像文件時,TGA可就派上用場了!
優(yōu)點
TGA格式支持壓縮,使用不失真的壓縮算法。
在工業(yè)設(shè)計領(lǐng)域,使用三維軟件制作出來的圖像可以利用TGA格式的優(yōu)勢,在圖像內(nèi)部生成一個Alpha(通道),這個功能方便了在平面軟件中的工作。
Tga常見的格式有非壓縮RGB和壓縮RGB兩種格式,文件的第三個Byte位作為標(biāo)記:2為非壓縮RGB格式,10為壓縮RGB格式。這里的類只實現(xiàn)讀取非壓縮格式的tga文件。
先給出tga文件的文件格式:
| 名稱 | 偏移 | 長度 | 說明 |
| 圖像信息字段長度 | 0 | 1 | 本字段是 1 字節(jié)無符號整型,指出圖像信息字段( 見本子表的后面 )長度,其取值范圍是 0 到 255 ,當(dāng)它為 0 時表示沒有圖像的信息字段。 |
| 顏色表類型 | 1 | 1 | 0 表示沒有顏色表,1 表示顏色表存在。由于本格式是無顏色表的,因此此項通常被忽略。 |
| 圖像類型碼 | 2 | 1 | 該字段總為 2 , 這也是此類型為格式 2 的原因。 |
| 顏色表規(guī)格字段 | 顏色表首址 | 3 | 2 | 顏色表首的入口索引,整型(低位-高位) | 如果顏色表字段為0,則忽略該字段 |
| 顏色表的長度 | 5 | 2 | 顏色表的表項總數(shù),整型(低位-高位) |
| 顏色表項位數(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 | 以像素為單位,圖像寬度的整型(低位-高位) |
| 圖像每像素存儲占用位數(shù) | 16 | 2 | 它的值為16,24 或 32 等等。決定了該圖像是 TGA 16,TGA24,TGA 32 等等。 |
| 圖像描述符字節(jié) | 17 | 1 | bits 3-0 - 每像素對應(yīng)的屬性位的位數(shù); 對于TGA 16, 該值為 0 或 1,對于 TGA???????????????????? 24,該值為 0,對于 TGA 32,該值為 8。 ? bit 4??? - 保留,必須為 0 ? bit 5??? - 屏幕起始位置標(biāo)志 0 = 原點在左下角 1 = 原點在左上角 對于 truevision 圖像必須為 0 ? bits 7-6 - 交叉數(shù)據(jù)存儲標(biāo)志 00 = 無交叉 01 = 兩路奇/偶交叉 10 = 四路交叉 11 = 保留 |
| 圖像信息字段 | 18 | 可變 | 包含一個自由格式的,長度是圖像由“圖像信息字段”指定。它常常被忽略(即偏移 0 處值為 0 ),注意其最大可以含有 255 個字符。如果需要存儲更多信息,可以放在圖像數(shù)據(jù)之后。 |
| 顏色表數(shù)據(jù) | 可變 | 可變 | 如果顏色表類型為 0,則該域不存在,否則越過該域直接讀取圖像顏色表規(guī)格中描述了每項的字節(jié)數(shù),為 2,3,4 之一。 |
| 圖像數(shù)據(jù) | 可變 | 可變 | RGB顏色數(shù)據(jù),存放順序為:BBB GGG RRR (AAA) |
?
代碼如下:
//========================================================/***??@file??????TGALoader.h**??項目描述:?TGA文件載入類*??文件描述:??紋理映射??*??適用平臺:?Windows98/2000/NT/XP*??**/?????//========================================================#ifndef?__TGALOADER_H__#define?__TGALOADER_H__#include?"stdafx.h"/**?TGA文件載入類?*/class?CTGALoader{???public:????????????CTGALoader();?????????????????????????????/**<?構(gòu)造函數(shù)?*/??????~CTGALoader();??????bool?LoadTGA(const?char?*file);??????????/**<?載入TGA文件?*/??????void?FreeImage();????????????????????????/**<?釋放內(nèi)存?*/???????bool?Load(const?char*?fileName);?/**<?載入TGA文件為紋理?*/??????unsigned?int?ID;????????????????????????/**<?生成紋理的ID號?*/??????int?imageWidth;?????????????????????????/**<?圖像寬度?*/??????int?imageHeight;????????????????????????/**<?圖像高度?*/??????unsigned?char?*image;???????????????????/**<?指向圖像數(shù)據(jù)的指針?*/??????unsigned?int?type;??????????????????????/**<?圖象類型GL_RGB?或GL_RGBA?*/};#endif //========================================================/***??@file??????TGALoader.cpp**??項目描述:?紋理映射*??文件描述:??TGA文件載入??*??適用平臺:?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文件?*/bool?CTGALoader::LoadTGA(const?char*?file){???FILE?*pfile;???unsigned?char?tempColor;??????????????/**<?用于交換顏色分量?*/???unsigned?char?bitCount;???????????????/**<?每象素的bit位數(shù)?*/???int?colorMode;????????????????????????/**<?顏色模式?*/???long?tgaSize;?????????????????????????/**<?TGA文件大小?*/???unsigned?char?unCompressHeader[12]?=?{0,?0,?2,?0,?0,?0,?0,?0,?0,?0,?0,?0};?/**<?未壓縮TGA文件頭?*/???unsigned?char?tgaHeader[12];??????????/**<?文件頭?*/???unsigned?char?header[6];??????????????/**<?文件頭前6個字節(jié)?*/???/**?檢查文件名是否為空?*/???if(!file)????????return?false;??????/**?打開文件?*/???pfile?=?fopen(file,?"rb");???if(!pfile)????????return?false;???/**?讀取文件頭前12個字節(jié)?*/???fread(tgaHeader,?1,?sizeof(tgaHeader),?pfile);???/**?比較文件是否為未壓縮文件?*/???if(memcmp(unCompressHeader,?tgaHeader,?sizeof(unCompressHeader))?!=?0)???????{???????????MessageBox(NULL,"文件類型錯誤!","錯誤",MB_OK);???????????fclose(pfile);???????????return?false;???????}???/**?讀取6個字節(jié)(從上面讀取的12個字節(jié)后再取6個字節(jié))?*/???fread(header,?1,?sizeof(header),?pfile);???/**?計算圖像的寬度和高度?*/???imageWidth?=?header[1]?*?256?+?header[0];???????imageHeight?=?header[3]?*?256?+?header[2];??????/**?獲取每象素的bit位數(shù)?*/???bitCount?=?header[4];???/** 計算顏色模式和圖像大小?*/???colorMode?=?bitCount?/?8;???tgaSize?=?imageWidth?*?imageHeight?*?colorMode;???/**?分配內(nèi)存?*/???image?=?new?unsigned?char[sizeof(unsigned?char)?*?tgaSize];???/**?讀取數(shù)據(jù)?*/???fread(image,?sizeof(unsigned?char),?tgaSize,?pfile);???/**?將BGA格式轉(zhuǎn)化為RGA格式?*/???for(long?index?=?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;???return?true;}/**?載入TGA文件并創(chuàng)建紋理?*/bool?CTGALoader::Load(const?char*?fileName){????if(!LoadTGA(fileName))????{????????MessageBox(NULL,"載入TGA文件失敗!","錯誤",MB_OK);????????exit(0);????}????/**?生成紋理對象名稱?*/????glGenTextures(1,?&ID);???????/**?創(chuàng)建紋理對象?*/????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);???return?true;}void?CTGALoader::FreeImage(){???/**?釋放內(nèi)存?*/???if(image)??????{?????????delete[]?image;?????????image?=?0;??????}}
總結(jié)
以上是生活随笔為你收集整理的TGA文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。