在颜色选择器上检索像素颜色时出现问题

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)颜色?

如何使用颜色选择器(滴管)?

UWP 中实现一个颜色选择器 UWPColorPickerControl

样式化 React Native 选择器

Android ListView 选择器颜色