我如何使用BI_RLE8从位图读取像素数据

时间:2014-03-01 12:33:42

标签: c++ bitmap compression

我有一个24位bmps的工作加载器,但是我下载尝试的图片是8位并且压缩BI_RLE8似乎相当普遍(我不知道2个值之间是否存在相关性?都是8位使用BI_RLE8压缩bmps?),所以我想为它添加功能,但它并没有真正实现。

现在我正在计算颜色数:

numColours = 1 << bitmapInfoHeader.biBitCount;

然后将它们读入彩色平板电脑阵列:

rgbquad = new RGBQUAD[numColours];
in.read((char*)rgbquad, sizeof(RGBQUAD)*numColours);

读取像素

LONG imageSize = (LONG)((float)bitmapInfoHeader.biHeight * (float)bitmapInfoHeader.biWidth * ((float)bitmapInfoHeader.biBitCount/8));
BYTE *bitmapImage=new BYTE[imageSize];
in.seekg(bitmapFileHeader.bfOffBits, std::ios::beg);
in.read((char*)bitmapImage, imageSize);

然后我提取这样的数据

for(int j=0, k = 0; j< bitmapInfoHeader.biHeight; j++){
    for(int i=0; i < bitmapInfoHeader.biWidth; i++){
        index = ( bitmapInfoHeader.biWidth * j) + i;
        pixelMap[index].setR(rgbquad[bitmapImage[k]].rgbRed);
        pixelMap[index].setG(rgbquad[bitmapImage[k]].rgbGreen);
        pixelMap[index].setB(rgbquad[bitmapImage[k]].rgbBlue);
        pixelMap[index].setA(255);
        ++k;
    }
}

一些比较图片:

原始图片:

Original image

加载重写后: After Loading an rewritting

我似乎错误地读取了像素,所以有人可以告诉我你是如何加载这些像素的,或者指向我指导的方向吗?

0 个答案:

没有答案