给定一个 R、G、B 三元组和一个因子 F,如何计算“水印”版本的颜色?

3

我有一个(R, G, B)三元组,其中每种颜色的取值范围在0.0和1.0之间。给定一个因子F(0.0表示原始颜色,1.0表示白色),我想计算一个新的三元组,即该颜色的“水印”版本。

我使用以下表达式(伪代码):

for each c in R, G, B:
    new_c ← c + F × (1 - c)

这样会产生看起来还不错的结果,但我了解到它会导致颜色的色相偏差(在变换前后检查HSV等效值),我不知道这是否是可以预料的。是否有计算“水印”版本颜色的“标准”(带引号或不带)算法?如果有,是哪个?如果没有,你能告诉我其他具有同样效果的算法吗?
2个回答

3
实际上,这看起来应该会给出正确的色调,减去算术舍入误差的小变化。
这绝对是一种合理、简单的实现水印效果的方法。我不知道还有什么其他“标准”的方法,但你可以用几种不同的方式来实现。
其中一种替代方案是:
将白色与混合,但在F上非线性地进行,例如 new_c = c + sqrt(F)*(1-c),或者您可以使用其他非线性函数——这可能有助于水印看起来更加“平坦”或不那么“平坦”。
您可以通过以下方式更高效地执行(其中F的范围为0..INF):
new_c = 1 - (1-c)/pow(2, F)

对于真实像素值(0..255),这将转换为:

new_c = 255 - (255-c)>>F

这不仅在整数运算中速度较快,而且您可能能够并行地在32位整数中进行。


你知道吗:我的算法是否与在初始颜色上混合白色和不透明度F相同?因为那可能是一种替代方法,但我认为它是相同的。无论如何,如果你知道其他方法,请更新你的答案。谢谢。 - tzot
是的,您的方法就像使用不透明度为 F 与白色混合一样,完全正确。 - andrewmu

0

为什么不呢?

new_c = F*c

我认为你应该先了解水印像素,弄清楚它是应该更暗还是更亮。

对于更亮的情况,公式可能是 new_c=1-F*(c-1)


1
这不会给出F=1.0的白色。 - andrewmu
它适用于 F = 0.0,第一个公式用于变暗,第二个用于变亮。 - Luka Rahne
F == 0.0 在第二个公式中产生白色(这是我的公式的反向,除了应该是 1-cc-1),但我确定在第一个公式中没有单个 F 可以为所有可能的三元组产生白色。无论如何,我很明确:0.0 原始颜色,1.0 白色。谢谢。 - tzot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接