解决方案 »

  1.   

    16 bit bmp没有调色板。按你在bitmapinfoheader中的设置,这是一幅16位彩色图,每个pixel 占16 bit(实际使用15bit,r,g,b分别占5bit,最高位bit未使用),而你的源图是16bit灰度图,每个像素只有一种灰度值,因此你转换时必须将16bit的灰度值缩减成5bit,然后分别复制到16bit bmp每像素相应的r,g,b上。颜色失真是必然的,因为是由65536种灰度缩小成32种灰度。
      

  2.   

    如果希望在16bit bmp中最大可能保留灰度值的精度,那么你的bmiHeader.biCompression必须设置成BI_BITFIELD, 然后在调色板的位置(即&bmi.bmiColors[0])放3个DWORD分别对应R, G, B颜色的mask, 然后将这3个mask设置成相同的值(即rgb的通道位置重叠),你可以尝试都设置成0xFFFF看看Windows是否能够正确显示。
      

  3.   

    我希望仍然能保持16位的深度,也就是65536颜色,应该怎么办呢?
    为什么BMP就不能用16位的呢?我也是2个字节保存的一个像素值呀。
    感谢回答。
      

  4.   

    我希望仍然能保持16位的深度,也就是65536颜色,应该怎么办呢?
    为什么BMP就不能用16位的呢?我也是2个字节保存的一个像素值呀。
    感谢回答。如果不能正确显示或存在某些像素显示错误,那么表示windows不支持16位深灰度,你只能想办法缩减成8位深度灰度值,可以直接在mask上做文章(比如设置mask=0xFF00),或者将mask设为0xFF然后复制像素时缩减每像素的灰度值。
      

  5.   

    我希望仍然能保持16位的深度,也就是65536颜色,应该怎么办呢?
    为什么BMP就不能用16位的呢?我也是2个字节保存的一个像素值呀。
    感谢回答。如果不能正确显示或存在某些像素显示错误,那么表示windows不支持16位深灰度,你只能想办法缩减成8位深度灰度值,可以直接在mask上做文章(比如设置mask=0xFF00),或者将mask设为0xFF然后复制像素时缩减每像素的灰度值。谢谢。
    我去试试,现在对这个还不是太熟,要边查资料边做。
    如果最后还是搞不定的话,那我就只有用CImage这种类库来显示了,这种类库显示的不是真,但是位深被改了,可能就是你说的那种原因吧,不支持16位深,因此被改成8位的了。
    我打算用类库显示图像,但是在计算图像某点像素的灰度值时,我使用原始数据来计算,目前只能这样了。
    感谢解惑。
    过两天来给分。