javascript - 如何在来回转换时保持 RGB 和 HSL 整数值一致?

标签 javascript c++ rgb photoshop hsl

我有将 RGB 值转换为 HSL 值以及将 HSL 转换为 RGB 的代码。 它工作正常,但是,我有一个可以在 rgb 或 hsl 中工作的颜色选择器。 问题是,它们都使用整数值..

因此,如果我将 RGB 转换为 HSL,我会得到需要四舍五入的分数。当我转换回 RGB 时,这些值与原来不同 - 数字通常是 1(在转为 RGB>HSL>RGB 后,值 123 可能会变成 124)。

我觉得这很奇怪,因为在 Photoshop 中,它们具有相同的颜色选择器 - 您可以在 RGB 和 HSB 之间进行选择,并且当您来回转换时,RGB 值保持一致,并且当您在两种模式下选择时它们使用整数值。 他们是如何做到这一点的?

最佳答案

颜色空间的整数值大小不同。

HSL 具有黑色(亮度为零)、加上白色(亮度为 100)以及 359 * 100 * 98 种其他颜色(因为色调 0 与色调 360 相同),形成 3,518,202 个整数三元组。

RGB 有 256 * 256 * 256,或 16,777,216 个整数三元组,因此多个 RGB 值可以映射到相同的 HSL 值 - 比例约为 4.7 比 1。

为了在更改选择器模式时保持一致性,您可能需要在内部将 HSL 值维护为浮点值,但在选择器中显示整数值。在内部将 RGB 值维持为浮点也可能有所帮助。

我在颜色软件中看到的另一个问题是将 HSL 到 RGB 转换获得的 RGB 值舍入为 0 到 255 范围内最接近的整数。我认为这是有问题的,因为它意味着 RGB 值1 到 254 包含范围的 1/255,而 0 和 255 各自仅包含范围的 1/255 的一半。我更喜欢的替代方案是将浮点 RGB 分量值映射为 256 到 255(如果您愿意,也可以为 255.99999),并取结果颜色分量的整数下限。这样,0 到 255 之间的整数分量值将分别获得范围的 (1/256)。

归根结底,如果您希望用户能够输入他们之前使用过的 HSL 值并获得完全相同的颜色,则需要允许带有小数位的 HSL 值。

关于javascript - 如何在来回转换时保持 RGB 和 HSL 整数值一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471944/

相关文章:

matplotlib - 对图像的 channel 进行切片并将 channel 存储到 numpy 数组中(与图像大小相同)。绘制 numpy 数组而不给出原始图像

javascript - 如何查看给定 JS 对象的所有属性?

javascript - jQuery - bxSlider 插件 reloadSlider 问题

c++ - 在 OpenCV 应用程序中,如何确定内存泄漏的来源并修复它?

c++ - 如何计算以任意字符集编码的字符串中的字符数

c++ - 按住滚动条卡住 win32 控制台应用程序

rgb - Arduino RGB LED 清除

javascript - Laravel 5.5 中的多字段排序

javascript - html内容的json解析错误

ios - 将 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 缓冲区转换为 RGB 缓冲区会创建蓝色图片