『Bitmap』若是8Bit圖檔則支持RLE編碼(run length encoding),但網絡上大多解釋器都不支持RLE解碼,實現它非常間單,但若顏色較多很可能壓縮後的尺寸比不壓縮之前還要大. Bitmap文檔的『compression』等於1則使用RLE8編碼: 渲染演示程式下載:
數值 | 簡介 |
00 00 | 本行結尾,座標移至下一行頭部 |
00 01 | 位圖結束完成解碼 |
00 02 x y | 第三第四字節分別當前位置的X與Y偏移量 |
00 len val val val 00 | 非壓縮不重複數據,此數值長度要以2對齊,不足以0補齊
若數值為:00 03 BB CC DD 00 則解壓後:BB CC DD |
len val | 壓縮的重複數據
若數值為:04 88 則解壓後:88 88 88 88 |
BMP-8Bit模式的RLE解碼
image:輸出
data:輸入RLE圖像數據
data_size:RLE圖像數據長度
void Load_RLE8_Bitmap(PBYTE image, PBYTE data, int data_size, int width)
{
BYTE value;
BYTE length;// 像素個數
int image_index = 0;
int data_index = 0;
int x = 0;
int y = 0;
while (data_index < data_size)// 遍歷壓縮後數據
{
if (data[data_index] == 0 && data[data_index + 1] == 0)
{// 本行結尾
data_index = data_index + 2;
x = 0;
++y;
}
else
if (data[data_index] == 0 && data[data_index + 1] == 1)
{// 位圖結尾
data_index = data_index + 2;
return ;
}
else
if (data[data_index] == 0 && data[data_index + 1] == 2)
{// 當前位置的偏移
x = x + data[data_index + 2];
y = y + data[data_index + 3];
data_index = data_index + 4;
}
else
if (data[data_index] == 0)
{// 非壓縮不重複數據
length = data[data_index+1];
image_index = y * width + x;
memcpy(image + image_index, data+data_index+2, length);
x = x + length;
data_index = data_index + length + 2 + length%2;
}
else
if(data[data_index] > 0)
{// 壓縮的重複數據
length = data[data_index];
value = data[data_index + 1];
image_index = y * width + x;
memset(image + image_index, value, length);
x = x + length;
data_index = data_index + 2;// 重複的像素
}
}
}