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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TGA文件格式

發布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TGA文件格式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TGA文件是計算機圖像文件一種 。TGA是由美國Truevision公司為其顯示卡開發的一種圖像文件格式,已被國際上的圖形、圖像工業所接受。現已成為數字化圖像,以及運用光線跟蹤算法所產生的高質量圖像的常用格式。TGA文件的擴展名為·tga,該格式支持壓縮,使用不失真的壓縮算法,可以帶通道圖,另外還支持行程編碼壓縮。

?

文件格式介紹如下:

Tga常見的格式有非壓縮RGB和壓縮RGB兩種格式。文件的第三個Byte位作為標記:2為非壓縮RGB格式,10為壓縮RGB格式。它們的具體格式如下:

1、非壓縮格式

圖片類型:2-非壓縮RGB格式

?

名稱

偏移

長度

說明

圖像信息字段長度

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)

2、壓縮格式

圖片類型:10-壓縮RGB格式

?

名稱

偏移

長度

說明

圖像信息字段長度

0

1

本字段是 1 字節無符號整型,指出圖像信息字段( 見本子表的后面 )長度,其取值范圍是 0 到 255 ,當它為 0 時表示沒有圖像的信息字段。

顏色表類型

1

1

0 表示沒有顏色表,1 表示顏色表存在。由于本格式是無顏色表的,因此此項通常被忽略。

圖像類型碼

2

1

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

顏色表規格字段

顏色表首址

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 之一。

圖像數據

可變

可變

采用RLE壓縮后的RGB顏色數據。

Tga的壓縮算法采用了RLE算法,RLE算法的基本思想是將數據分為兩大類:

A:連續的不重復字節

B:連續的重復字節

RLE算法應用于RGB格式的圖片壓縮中,則把數據分為:

A:連續的不重復像素顏色值

B:連續的重復像素顏色值

然后將數據按這兩類數據分成若干長度不相等數據塊,每個數據塊的開始都是一個1個字節長度的header(RLE在純數據壓縮中header位2個字節16位),后面緊跟著data數據塊,如下。

?

Header(1個字節)

Data(變長)

每個header的第一位作為標記:0表示A類顏色數據,1表示B類顏色數據。剩下的7位意義如下:

對于A類數據:表示data有多少個像素的RGB顏色值。取值0-127,0表示1個像素,所以最多為128個像素,data塊則為這些不重復的像素RGB顏色值。

對于B類數據:表示有多少個像素具有相同的RGB顏色值。取值0-127,0表示1個像素,所以最多為128個像素,data僅包含一個像素的顏色值,即為重復的那個顏色值。

實現將TGA文件(非壓縮)加載到內存的代碼如下(OpenGL)

?

bool LoadTGA(TextureImage *texture, char *filename) // Loads A TGA File Into Memory { GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; // Uncompressed TGA HeaderGLubyte TGAcompare[12]; // Used To Compare TGA HeaderGLubyte header[6]; // First 6 Useful Bytes From The HeaderGLuint bytesPerPixel; // Holds Number Of Bytes Per Pixel Used In The TGA FileGLuint imageSize; // Used To Store The Image Size When Setting Aside RamGLuint temp; // Temporary VariableGLuint type=GL_RGBA; // Set The Default GL Mode To RBGA (32 BPP)FILE *file = fopen(filename, "rb"); // Open The TGA Fileif( file==NULL || // Does File Even Exist?fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) || // Are There 12 Bytes To Read?memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0 || // Does The Header Match What We Want?fread(header,1,sizeof(header),file)!=sizeof(header)) // If So Read Next 6 Header Bytes{if (file == NULL) // Did The File Even Exist? *Added Jim Strong*return FALSE; // Return Falseelse // Otherwise{fclose(file); // If Anything Failed, Close The Filereturn FALSE; // Return False}}texture->width = header[1] * 256 + header[0]; // Determine The TGA Width (highbyte*256+lowbyte)texture->height = header[3] * 256 + header[2]; // Determine The TGA Height (highbyte*256+lowbyte)if( texture->width <=0 || // Is The Width Less Than Or Equal To Zerotexture->height <=0 || // Is The Height Less Than Or Equal To Zero(header[4]!=24 && header[4]!=32)) // Is The TGA 24 or 32 Bit?{fclose(file); // If Anything Failed, Close The Filereturn FALSE; // Return False}texture->bpp = header[4]; // Grab The TGA's Bits Per Pixel (24 or 32)bytesPerPixel = texture->bpp/8; // Divide By 8 To Get The Bytes Per PixelimageSize = texture->width*texture->height*bytesPerPixel; // Calculate The Memory Required For The TGA Datatexture->imageData=(GLubyte *)malloc(imageSize); // Reserve Memory To Hold The TGA Dataif( texture->imageData==NULL || // Does The Storage Memory Exist?fread(texture->imageData, 1, imageSize, file)!=imageSize) // Does The Image Size Match The Memory Reserved?{if(texture->imageData!=NULL) // Was Image Data Loadedfree(texture->imageData); // If So, Release The Image Datafclose(file); // Close The Filereturn FALSE; // Return False}for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel) // Loop Through The Image Data{ // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)temp=texture->imageData[i]; // Temporarily Store The Value At Image Data 'i'texture->imageData[i] = texture->imageData[i + 2]; // Set The 1st Byte To The Value Of The 3rd Bytetexture->imageData[i + 2] = temp; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)}fclose (file); // Close The File// Build A Texture From The DataglGenTextures(1, &texture[0].texID); // Generate OpenGL texture IDsglBindTexture(GL_TEXTURE_2D, texture[0].texID); // Bind Our TextureglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear FilteredglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Filteredif (texture[0].bpp==24) // Was The TGA 24 Bits{type=GL_RGB; // If So Set The 'type' To GL_RGB}glTexImage2D(GL_TEXTURE_2D, 0, type, texture[0].width, texture[0].height, 0, type, GL_UNSIGNED_BYTE, texture[0].imageData);return true; // Texture Building Went Ok, Return True }

?

上面只是簡單的介紹了TGA文件格式的一些情況,更詳細的細節和代碼可參考下面的鏈接:

TGA格式介紹(1)

TGA格式介紹(2)


?

?

總結

以上是生活随笔為你收集整理的TGA文件格式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。