在颜色选择器上检索像素颜色时出现问题
Posted
技术标签:
【中文标题】在颜色选择器上检索像素颜色时出现问题【英文标题】:Problem retrieving pixel color on color picker 【发布时间】:2011-04-18 13:47:18 【问题描述】:我目前正在制作一个颜色选择器(非常标准的颜色选择器,与 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
));
只是为了澄清代码,我只是使用选择器的坐标来创建一个新的 HSB 颜色(饱和度在 X 轴上表示,亮度(值)在这种颜色选择器的 Y 轴上表示)。然后我将此 HSB 颜色转换为十六进制并将其分配给一个属性。目前色调始终设置为 0,但这无关紧要,因为我只使用纯红色进行测试。
它部分完成了我想要的,但返回的颜色值对于大多数角落都是相反的: 对于 (0,0) 它应该返回 0xFFFFFF,但它返回 0x000000 对于 (256, 0) 它应该返回 0xFF0000,但它返回 0x000000 对于 (0, 256) 它应该返回 0x000000,但它返回 0xFFFFFF 对于 (256, 256) 它应该返回 0x000000,但它返回的是 0xFF0000
我在代码中尝试了许多变体,但似乎无法正确修复它。欢迎任何回复/建议!
【问题讨论】:
【参考方案1】:我认为错误(或其中之一)使用了 0..256 范围内的值,这似乎会导致溢出,请尝试改用 0..255。
【讨论】:
在这种情况下它并没有真正改变任何东西,问题实际上是我无法计算的角值的反转。 在这种情况下,发布hsbToHex
的代码将是发现错误的唯一方法,还是这是一个内置函数?
这是我制作的一个函数,但我已经对其进行了测试,并将其值与 Photoshop 的值进行了比较。此外,它只是您日常的转换算法,您可以在网上找到从 HSB 到 RGB,然后二进制移位将 RGB 转换为 Hex。【参考方案2】:
只需交换 X 和 Y 轴即可解决。
【讨论】:
【参考方案3】:假设注册点居中,这似乎是因为你这样做:
(_colorSelector.x + _colorSelector.width/2)
我认为你的公式应该是这样的:
(_colorSelector.x + _colorSelector.width/2) / _colorSelector.width
如果您的注册点位于 (0,0),则应该是:
(_colorSelector.x / _colorSelector.width);
上面应该给你一个在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:我希望你明白,因为我没有编译上面的代码,也许我搞砸了一些括号或犯了一些其他愚蠢的错误。
【讨论】:
以上是关于在颜色选择器上检索像素颜色时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
像素化图像,使用 PHP 从中选择可打印的(Pantone)颜色?