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)
?
?
總結
- 上一篇: 带你快速了解EDIUS各版本序列号的内容
- 下一篇: java迭代器删除元素_java迭代器中