如何将 RGB 百分比转换为 RGB 值?



给定颜色的RGB百分比,例如"野西瓜",(99%, 42%, 52%),正确的RGB值(252, 108, 133)

但是当我尝试时

rgb_percent = ('99%', '42%','52%')
rgb_values = tuple(int(int(s.strip('%')) * 2.55) for s in rgb_percent)
print(rgb_values)

[输出]:

(252, 107, 132)

颜色看起来相似,但它们不是正确的值。如何将 RGB 百分比正确转换为 RGB 值?

我应该向上/向下舍入它们还是将值转换为整数?这似乎更接近,但仍然不是预期的值:

tuple(int(round(int(s.strip('%')) * 2.55, 0)) for s in rgb_percent)

[输出]:

(252, 107, 133)

您无法获得完全相同的值,因为您将数字四舍五入。 100 和 255 不是倍数。您的百分比 RGB 似乎都是整数,因此您丢失了至少 1 位信息(也可能丢失了 2 位)。因此,您不能期望在所有情况下都具有确切的值。(不能将 100 个数字映射到 256 个值,并获取所有 256 个值)。

但好处是:你不需要它(通常)。你的眼睛不是那么明智(我们无法看到RGB与256x256x256值的所有组合:我们的眼睛可以区分的颜色要少得多,所以在某些情况下你不会看到任何差异,在某些情况下,它只是几乎不明显)。此外,一些监视器面板技巧每个通道仅显示 64 种不同的色调(很少有人注意到它)。考虑到如果您从 JPEG 图像中获取数据,您将获得额外的转换(数据不存储为 RGB 数据,而是存储为 YCC)。

为了获得最佳选择,你需要知道原始算法(它们是round还是trunc?或者你应该有一个更大的示例测试,并检查不同算法之间的差异(例如,有多少情况是精确的,有多少是1关闭,2关闭,3关闭)。

注意:您有 3 种可能性:round()math.floor()math.ceil()。我会避免使用int:根据 Python 文档,结果似乎取决于系统标准库(它可能被截断或四舍五入)。注意:对于正数(或零),math.trunc()math.floor()给出相同的结果。

一般来说,我更喜欢舍入:它给出了 0% 和 100% 的预期结果(ceil 与这些极值相似)。

PS:没有"正确的RGB值"。历史上,RGB 以 0 到 100 的数字(可能为浮点数)或 0.0 到 1.0 之间的数字给出。只是 HTML 将 0 推到 255,但如果你的屏幕可以显示更多颜色,它会导致问题。对于 RGB,您可能是指 R*G*B*,所以不是线性 RGB,而是 OETF 校正的 RGB)。

不:没有信誉良好的来源。没有人遵循标准,所以不要指望转换颜色通道(例如到99%)的人使用完全相同的方法(我们程序员很懒)。标准倾向于使用浮点数。注意:程序内部可能使用浮点数,因此在颜色选择器中,您可能会获得具有相同显示%值的不同颜色,具体取决于您输入颜色的方式。或者您是否参考指定%-值的特定标准?我们无法同意黑色是 0,0,0 还是 16,16,16(例如.MPEG-2,或电视和其他有限范围的 RGB设备),或者如何进行或解释伽马校正(好吧:最近和不太新的标准更精确,但大多数程序没有得到它)。同样在读取您的"RGB"值时,过去我会假设它会是sRGB(所以网络和Microsoft的颜色空间),但几年来苹果使用不同的颜色空间(Apple P3),而其他人则遵循扩展sRGB。混沌。因此,只需测试不同的方法(并用眼睛检查质量)。

我没有重新发现不同颜色代码的性质,而是研究了这些软件包,并为此找到了一个可用且详细的软件包。当我们查看此包的代码时,已经提到并解决了类似的问题。借助这个包,在位逆向工程的帮助下,我找到了这种方式:

#pip install webcolors #to install
import webcolors as wco
hex = wco.rgb_percent_to_hex(('99%','42%','52%'))
wco.hex_to_rgb(hex)

雷苏特IntegerRGB(red=252, green=107, blue=133).

虽然没有rgb_percent_to_rgb函数代替这个,但我将百分比值转换为十六进制,然后将它们转换为值。

是的,在将它们转换为 int 值之前四舍五入,但请记住浮点值并不精确,因此您不会总是获得预期的输出

最新更新