如题

解决方案 »

  1.   

    取每个像素的颜色值,(WORD)R>>3+(WORD)G>>2<<5+(WORD)B>>3<<11。
      

  2.   

    ,(WORD)R>>3+(WORD)G>>2 < <5+(WORD)B>>3 < <11我觉得这样还不完善,因为这样会导致整个整个图像颜色偏暗,比如拿红色来说,红色用5位来表示,那么按照上面的计算公式红色的最大值为11111000,即248,所以我认为还要在这个基础上乘以255/248,把整个颜色量化到0-255,(当然中间有的颜色值会没有的)。还有,仅仅考(WORD)R>>3+(WORD)G>>2 < <5+(WORD)B>>3 < <11这样的转换公式还是不够的,这样图像还是24位的
    我认为正确的24位转换为16位图像的方式应该是:
    1、读取24位真彩色图像的数据,建立一个对应大小的24位DIBSECITON,将图像数据Bitblt到Dibsection中,当然还有一些DC操作。
    2、建立一个大小和上述大小相同的16位的DIBSECITON,对每两个字节按照上述公式计算结果值,当然还有一些对齐问题。转换的过程是很快的,并且肉眼上基本是看不出什么区别的。上述操作我是用VB实现的,我想用VC也是同样的道理。
      

  3.   

    ,(WORD)R>>3+(WORD)G>>2 < <5+(WORD)B>>3 < <11我觉得这样还不完善,因为这样会导致整个整个图像颜色偏暗,比如拿红色来说,红色用5位来表示,那么按照上面的计算公式红色的最大值为11111000,即248,所以我认为还要在这个基础上乘以255/248,把整个颜色量化到0-255,(当然中间有的颜色值会没有的)。还有,仅仅考(WORD)R>>3+(WORD)G>>2 < <5+(WORD)B>>3 < <11这样的转换公式还是不够的,这样图像还是24位的
    我认为正确的24位转换为16位图像的方式应该是:
    1、读取24位真彩色图像的数据,建立一个对应大小的24位DIBSECITON,将图像数据Bitblt到Dibsection中,当然还有一些DC操作。
    2、建立一个大小和上述大小相同的16位的DIBSECITON,对每两个字节按照上述公式计算结果值,当然还有一些对齐问题。转换的过程是很快的,并且肉眼上基本是看不出什么区别的。上述操作我是用VB实现的,我想用VC也是同样的道理。
      

  4.   

    //24位转16位要进行抖动.不需要抖动,我估计 jennyvenus 理解为24位真彩色图像变为索引色的16色了,那是两个不同的概念
      

  5.   

    http://www.integon.cn/html/Game-developers/4861.php抖动的原理及代码,可以用256色最大程度的少失真显示真彩色。
      

  6.   

    最近也在研究这个,window在最后画图时,要么24位真彩,直接24位RGB表示,要么建立调色板,用索引查找,可是是建一个16位调色板最多要6万多种颜色,太大了,如果不是设备颜色深度限制,还不如用24位减色表示16位颜色.常用的文件格式也也没有直接支持16位,只好用24位来存储16位,这样的话好像没什么必要。