如何用DIB绘制8位的灰度图像?绘出的灰度图像为什么出现蓝色和红色?

1个回答

  • iBitCount为8时要建立调色板和颜色表,真彩色(如:24位位图)则不需要调色板和颜色表.

    (我猜想之所以这样处理,是出于节省内存的考虑.因为对于24位位图,它能表示的颜色数很多,如果要建一个颜色表,这个颜色表本身的开销就不小,还不如不要颜色表,颜色数据区的数值就表示BGR值,但对于诸如1、4、8位的位图,它们所能展现的颜色数是非常有限的,如果还用24位位图的处理方法:每个像素点的颜色值占3个字节表示BGR值,那么当图像尺寸很大时,还不如建一个颜色表,把这张位图用到的各种颜色事先定义,而在颜色数据区分别用1bit、4bit、1byte来存储该像素点的颜色在颜色表中的索引值.)

    所以你的程序对于24位位图测试成功,对8位位图等则不会成功.

    颜色表中RGBQUAD描述每一种颜色项.对于1、4、8、24位位图,需要的RGBQUAD结构体的数量分别为:2、16、256、0.

    typedef struct tagRGBQUAD {

    BYTE rgbBlue;

    BYTE rgbGreen;

    BYTE rgbRed;

    BYTE rgbReserved;

    } RGBQUAD; // 占用四个字节

    其实,从位图文件头BITMAPFILEHEADER的成员bfOffBits可以计算出来所需RGBQUAD的个数.对于8位位图,这个成员的值为1078.则RGBQUAD的个数是:(1078 - 54) / 4 = 256.