当我获得RGB格式的颜色时,如何将通道转换为(近似)整数比? 例如:
(255, 0, 0) -> (1, 0, 0)
(255, 128, 0) -> (2, 1, 0)
(128, 64, 0) -> (2, 1, 0)
(255, 1, 0) -> (1, 0, 0)
(3, 2, 0) -> (3, 2, 0)
(11, 5, 0) -> (11, 5, 0) or possibly (2, 1, 0)
如您所见,结果整数应尽可能小,但仍然相当精确,因此色调中的误差与人眼无法区分。
我尝试将所有频道划分为最小值,然后将其舍入,但它为(2, 1, 0)
生成(3, 2, 0)
,这是不必要的不精确。
答案 0 :(得分:1)
您可以尝试减少因子(1,2,4,8,...,256)并计算一些"舍入误差"。然后坚持使用可接受误差的最大因子。
<强> -OR - 强>
只需将RGB转换为色相,饱和度,值(HSV),并在一组有限的色调值上选择最接近的色调值。
答案 1 :(得分:1)
我可以看到两种合理的策略来计算最佳比率。它们都需要一个额外的参数,您必须进行一些实验才能看到您认为仍然可以容忍的内容(1. maxRatio,2。maxError):
找到没有大于给定maxRatio的比率的最佳解决方案:
如果你应用这个策略,那么一个解决方案(如果你不太关心性能)是获得最大的颜色值并除以最大比率(小心,没有整数除法,可能需要施放得到因子f
。现在,您将其他颜色除以f
并将结果四舍五入以再次获得整数。将检索到的比率乘以f
减去实际颜色值,将其平方并取所有值的总和。存储此错误并重复减少maxRatio一。直到maxRatio是两个或一个。找到最小的错误并返回相应的比率。 (这只是为了简化您到目前为止只能跟踪最佳解决方案及其错误,并且不需要存储所有这些解决方案。)
查找不超过maxError的最小比率
这个策略有点困难。如果您更关心性能,那么您可以执行以下操作:保存原始颜色的副本作为最佳比率,一个作为当前比率。然后你开始减小当前比率的值,直到一个值为0或最大值为1,如下所示:找到当前比率的最大值,将其减1(如果有相等的值,则选择颜色较大的值)然后看看减小当前比率的其他值是否会减少误差(如果是这样,减少)。如果当前比率的误差小于maxError,则将其保存为最佳比率。并继续减少。