OpenGL之讀取Targa圖檔-RLE解碼

OpenGL之讀取Targa圖檔-RLE解碼

『Targa』與『Bitmap』同樣支持RLE編碼,單編碼方式有點不同.而且『索引、RGB、灰度』均支持RLE編碼.RLE編碼無非兩種方式『重複』與『不重複』的像素.渲染演示程式下載:

讀取ID 簡介
if(ID>=128)

Len = (BYTE)(ID – 127);

重複像素

LEN像素量

if(ID<128)

Len = BYTE(ID + 1);

不重複的像素

LEN=像素量

RLE解碼的C代碼

image:輸出

data:輸入RLE圖像數據

image_size:image圖像數據長度

pixel_size:像素大細

void Load_RLE_Targa(PBYTE image, PBYTE data, int image_size,int pixel_size)

{

BYTE id;//重複像素ID>=128,不重複的像素ID<128

BYTE length; //像素個數

BYTE pixel[4] = {0,0,0,0};// 像素

int image_index = 0;//圖像索引

int data_index = 0;//RLE索引

while (image_index < image_size)

{

id = data[data_index++];// 讀取ID

if (id >= 128)// 重複的像素

{   // 像素個數

length = (BYTE)(id – 127);//像素個數

memcpy(pixel, &data[data_index], pixel_size); // 讀重複像素

data_index = data_index + pixel_size;//移動RLE索引

while (length > 0)//  重複寫入數據

{

memcpy(image+image_index, pixel, pixel_size);//重複寫入數據

image_index = image_index + pixel_size;//移動圖像索引

–length;// 個數減一

}

}

else

{  // 不重複的像素

length = BYTE(id + 1); // 像素個數

// 拷貝像素

memcpy(image+image_index, data+data_index, length*pixel_size);

image_index = image_index + length * pixel_size;// 移動圖像索引

data_index = data_index + length * pixel_size; //移動RLE索引

}

}

}

評論