一个24bit的位图转换成16bit,8bit或4bit位图时,在Windows上可以利用调色板通过各种算法(如八叉树颜色量化算法)得到转化。但是现在的问题是,如果要把这幅24bit位图转化成在没有调色板的系统上(如16bit的液晶显示器)进行显示,假设转成16bit的,那该怎么做呢?
  简单的做法是分别提取R,G,B颜色的5位,6位和5位,但是着显然有较大的失真。
  有什么好的算法没有呢?

解决方案 »

  1.   

    图象我不清楚,但是我做声音转换的时候是这样做的,说出来不知道有没有参考价值把16bit样本转化成8bit样本:
    n = a / 65536  //转换成比例大小,也叫“标准化”过程。
    b = n * 256
    完成,其中a为16bit数,b为8bit数
      

  2.   

    R,G,B颜色的高5位,6位和5位,不是低
    http://blog.joycode.com/jiangsheng/articles/3579.aspx
      

  3.   

    这样的问题我也碰到了,我做了比较细致的研究,可以由如下几种方法达到比较好的结果。24bit->8bit或者4bit第一,可以通过八叉树进行减色处理,可以达到非常好的效果;第二,可以通过统计色彩编码的方法,就是从一幅图像中统计出使用最多的256种颜色,然后将图像中的颜色依此往这256种颜色按最短的色彩距离映射,即可得到比较好的结果。
        现在的减色方法都是比较成熟的算法,不知道楼主研究它做什么用。24bit->16bit比较的容易,因为graylevel = 0.29 * R + 0.59 * G + 0.11 * B, 因为人的眼睛对灰度比较敏感,16bit 不能被3整除,而Green通道对灰度的贡献是比较大的,所以对Green通道的量化细一些,R:G:B = 5:6:5,Green通道多分了一个bit,就是这个道理,24bit转16bit按照如下公式即可,(C描述)
           R_16Bit = R_24Bit >> 3;
           B_16Bit = B_24Bit >> 3;
           G_16Bit = G_24Bit >> 2;
           color_16Bit = ((short)R_16Bit << 11) | ((short)G_16bit << 6) | ((short)B_16Bit);
    24bit转1bit,就是转变成黑白图像,方法只有一个,区别模式识别中的二值化,二值化不仅丢失图像的色彩信息,而且丢失图像的细节。转成黑白图像还要保留图像的大部分细节是非常重要的,使用的是抖动的方法,去图书馆去找找相应的图书,图像处理方面的,都有关于抖动发的论述,可以用两种颜色表示n个灰度级别,从而保留了图像的细节。而不是二值化,二值化是将图像变成了黑白的,但是他是去掉图像的许多细节,保留图像用于识别的部分.
        楼主就说这么多了,如果你有什么问题,欢迎于我讨论,也欢迎大家与我讨论!