代码之家  ›  专栏  ›  技术社区  ›  tzot

给定一个r、g、b三元组和一个因子f,如何计算颜色的水印版本?

  •  3
  • tzot  · 技术社区  · 13 年前

    我有一个(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 回复  |  直到 13 年前
        1
  •  3
  •   andrewmu    13 年前

    实际上,这看起来应该给出正确的色调,减去算术舍入误差的小变化。

    这无疑是一种合理、简单的水印效果。我不知道还有其他什么“标准”的,有几种方法可以做到。

    备选方案包括:
    与白色混合,但在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
    

    不仅在整数运算中速度相当快,而且您还可以在32B整数中并行执行。

        2
  •  0
  •   Luka Rahne    13 年前

    为什么不呢?

    new_c = F*c
    

    我认为你应该先检查一下水印像素,看看它应该是暗的还是暗的。

    为了更轻,公式可能是 新_c=1-f*(c-1)