加载一幅位图后(彩色),有时候在将这幅去色,变成黑白的, 这个好处理 getpixel,将后将这个颜色去色处理,再setpixel就行了, 但现在我的应用要求在原彩色图片在处理, 把这幅图相应的变蓝,变红, 或是变绿等等,如下图PS里可以设置让原图 加深一定值的蓝色或其它 
我原来的思路是这样的:clr = getpixcel(x, y)得到一个点颜色后, clr->hsb(取值范围0-240,跟windows画图那里的一致),然后将这个hsb的h值+-*/得到一个h在蓝色范围内,s, b都不变,但是这个思路有问题。

解决方案 »

  1.   

    变蓝变绿最简单的不就是在RGB空间搞,把RGB的某一分量加上去。当然可能效果不如在其他空间搞得好。
      

  2.   

    用不着转到HSB,直接增加RGB相应分量就可以了。
    用HSB的话,不能进行色调变换,只能调整RGB某一分量的饱和度和亮度来实现你的需求。
      

  3.   

    图片最好改色的是在POTOSHOP里改啦,在色像饱合里设置就行了。
      

  4.   


    还是不明白,“变蓝变绿最简单的不就是在RGB空间搞,把RGB的某一分量加上去”怎么做呢,RGB(212,192,230)变蓝色 RGB(212, 192, 230 - value) ,变绿色(212 - value, 192 + value , 230-value)? 这个方法有问题吧?目的效果如下:
    原图200*200, 一共200*200个颜色, 当用户选择加深蓝色10后, 新图(全图)相应的变蓝。我另一个方法是如下,原图不变,在原图在创建一个区域(通过区域剪裁,区域仅是图片区域),在这个rgn上刷rgb(0,0,255),然后把这个刷后的“图层”透明度40%粘在原图上,也达到了我要的效果,测试时不效率,小图片倒不怎么,大图要这样处理直接刷半天。所以想用HSB,通过改H的值,S和B都不变,来实现原先就是想 RGB(255,0,255)紫色,转换到HSB(200,240,120),那么我想将这个颜色调蓝的做法就是把H控制到120~180的范围,但具体该是多少,就不确定了。
      

  5.   

    RGB(212,192,230)变蓝色 RGB(212, 192, 230+value)
    这种方法肯定在效果上不够理想,但是能达到效果。另外你刷透明遮罩实际就是做个alpha混合,RGB(r,g,b)加蓝色混合就变成RGB(r*0.6,g*0.6,b*0.6+255*0.4)
      

  6.   

    RGB(r*alpha,g*alpha,b*alpha+255*(1-alpha))
    alpha取值[0,1]
      

  7.   

    如果只是加深 R G B中的一个 用gamedragon 应该足够了
      

  8.   

    其实有个办法可以测试 photoshop是怎么实现的自己做个图,多分几块,每块设置成一个颜色。
    用ps处理这个图,然后在不同的颜色空间下比较
    看它是在哪个空间下搞得。
    然后再测试它用的算法,应该不难 只是多花点时间
      

  9.   


    谢谢gamedragon的帮助。原色RGB(212, 135, 25)加深蓝色RGB(0, 0, 255),透明度40%,新色RGB(212*0.6, 136*0.6, 25*0.6 + 255*0.4) = RGB(127, 81, 117)是对的。
    RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)时alpha值都是0.6,这个0.6是怎么得到的?
    如果是加深RGB(33,197, 45),此时的alpha怎么取得?