我想将picture1里的图片降色后画到picture2上,意思就象是类似真彩的图片转成256色图片那样,不过我想转更少的颜色,30个色,目前我是用的方法是:
Enum RGBColor
    gcRed = 1
    gcblue = 2
    gcgreen = 3
End Enumsub color()
for x = 0 to 100
for y = 0 to 100
c = picture2.point (x,y)
s = 3 '控制颜色数量的指数
r = (GetRGBColor(c, gcRed) \ (255 \ s)) * (255 \ s)
g = (GetRGBColor(c, gcgreen) \ (255 \ s)) * (255 \ s)
B = (GetRGBColor(c, gcblue) \ (255 \ s)) * (255 \ s)
xd = RGB(r, g, B)
picture1.PSet (X, Y), xd
next
next
end sub
这样的方法是转出低颜色数啦.可是这么转并非向我想象的那样能用那个s变量来控制输出颜色的数量,现在s是3,输出的颜色数大概是15个左右,并不能保证一个固定的色数,所以,谁能些一段代码,将一个图片从真彩转换到30色,再设一个变量,好允许我控制转化后的颜色数,并且转成低色后,每个颜色的值应该尽量靠近原先颜色,使转换后的图片尽量的还原,象我用的那种方法,即使一个10色的图片,转换后也是面目全非啦.
请高手指点指点,尽量代码写得通俗易懂些.

解决方案 »

  1.   

    颜色值是0-255共256个阶层,如果你要转换为32(即0-31,为了说明计算方便所以没用30)阶层的话也就是说把原来的数值重新分段原来的0 to 7 = 新的 0
    原来的8 to 15 = 新的 1
    …………………………
    原来的238 to 246 = 新的 30
    原来的247 to 255 = 新的 31然后将新的颜色乘以8(256\32后得出)就得出新的数值了,对应原来的数值分别为
    0,8,16,24,32,40……………………240,248 (也可以将所有数值加上一个偏移量,力求接近原来数值,偏移量为256\32\2)
    这样算法就出来了
    s=32
    r=(GetRGBColor(c, gcRed)\(256\s))*(256\s)+(256\s\2)
    g=(GetRGBColor(c, gcgreen)\(256\s))*(256\s)+(256\s\2)
    b=(GetRGBColor(c, gcblue)\(256\s))*(256\s)+(256\s\2)s的取值最好为2的某次方,否则误差会很大,颜色偏差也就很大
      

  2.   

    和我的方法不是一样吗.分阶,好象和GIF的处理方法差距很大.感觉效果并不是很高.还原度不高.
      

  3.   

    如果不定义调色板的话这样是最优算法,那么少的色数怎么可能有多好的效果?另外你的算法中使用255就会产生问题,255仅是最大值,而颜色数值是0-255共256阶,再有颜色数量定义为2的某次方,这样就能减少误差,另外加入偏移量也可以提高色彩还原效果。谈到gif的处理的话,就需要定义调色板了。
      

  4.   

    需要定义调色板
    先讲图片保存为32位色图片,然后加载
    参考:http://expert.csdn.net/Expert/topic/1538/1538596.xml?temp=.3830225
    其实,不保存文件也是一样可以实现的