『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索引
}
}
}