2010-09-28 122 views
1

我目前正在制作一个颜色选择器(非常标准,与当前较少选项的photoshop几乎相同:仍处于早期阶段)。这是实际的东西的图片:http://i.stack.imgur.com/oEvJW.jpg检索颜色选择器上的像素颜色的问题

问题是:检索颜色选择器(小的,另一个是鼠标)下的像素的颜色,我有这条线,我认为会做到这一点:

_currentColor = Convert.hsbToHex(new HSB(0, 
    ((_colorSelector.x + _colorSelector.width/2)*100)/_largeur, 
    ((_colorSelector.y + _colorSelector.height/2)*100)/_hauteur 
)); 

只是为了澄清的代码,我简单地使用选择的坐标,以上的Y轴创建一个新的HSB颜色(饱和度被表示在X轴上和亮度(值)这种颜色选择器)。然后将此HSB颜色转换为十六进制,并将其分配给属性。现在色相始终设置为0,但这不相关,因为我只使用纯红色进行测试。

这部分做什么,我想,但返回的颜色值反转的大部分角落: 为(0,0),它应该返回0XFFFFFF,但它返回0x000000处,而不是 (256,0),这是应该返回为0xFF0000,但它不是 返回0x000000处为(0,256),它应该返回0x000000处,但它返回0XFFFFFF代替 为(256,256),它应该返回0x000000处,但它返回为0xFF0000,而不是

我在代码中尝试了很多变体,但我似乎无法正确修复它。任何回复/建议都比欢迎!

回答

0

我认为错误(或其中之一)正在使用0..256范围内的值,这似乎会导致溢出,请尝试使用0..255来代替。

+0

它在这种情况下并没有真正改变任何东西,问题实际上是我无法确定的角点值的倒置。 – Sheavi 2010-09-28 23:16:08

+0

在这种情况下,发布'hsbToHex'的代码将是唯一的方法来发现错误,或者这是一个内置函数? – schnaader 2010-09-28 23:18:48

+0

它是我制作的一个功能,但我已经对它进行了测试,并将其与photoshop的值进行了比较。此外,它只是您日常的转换算法,您可以在网上找到从HSB到RGB,然后二进制转换以将RGB转换为十六进制。 – Sheavi 2010-09-28 23:24:22

0

假设登记点为中心,这似乎是因为你正在做的情况:我觉得你公式应是这个样子

(_colorSelector.x + _colorSelector.width/2) 

(_colorSelector.x + _colorSelector.width/2)/_colorSelector.width 

如果您的注册(0,0),应该只是:

(_colorSelector.x/_colorSelector.width); 

上面应该是g你在范围内的数字0...1

此外,你应该反转这个值的亮度(因为低y值代表高亮度和高y值,低亮度;所以亮度沿y轴减小,而沿着x轴饱和度增加)。所以对于你的y轴你应该这样做:

1 - ((_colorSelector.y + _colorSelector.height/2)/_colorSelector.height) 

(再次假设注册点居中)。

如果你的转换函数期望的百分比,那么你就应该乘以100

(_colorSelector.x + _colorSelector.width/2)/_colorSelector.width * 100 
(1 - ((_colorSelector.y + _colorSelector.height/2)/_colorSelector.height)) * 100 

也许我失去了一些东西,但。我不知道_largeur_hauteur来自哪里,但它看起来像是宽度和高度。我认为你应该使用_colorSelector的高度和宽度,但我可能是错的。

PS:我希望你明白,因为我没有编译上面的代码,也许我搞砸了一些括号或做了一些其他愚蠢的错误。