我想将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色的图片,转换后也是面目全非啦.
请高手指点指点,尽量代码写得通俗易懂些.
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色的图片,转换后也是面目全非啦.
请高手指点指点,尽量代码写得通俗易懂些.
原来的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的某次方,否则误差会很大,颜色偏差也就很大
先讲图片保存为32位色图片,然后加载
参考:http://expert.csdn.net/Expert/topic/1538/1538596.xml?temp=.3830225
其实,不保存文件也是一样可以实现的