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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TGA文件

發(fā)布時間:2025/3/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

它的值為1624 32 等等。決定了該圖像是 TGA 16TGA24,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ù),為 234 之一。

圖像數(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)容還不錯,歡迎將生活随笔推薦給好友。