5

我正在尝试模拟 Open XML 的色调效果。它所做的是通过改变色调来改变图像中像素的色调。它需要 2 个参数:1)hue(以度为单位)和 2)amt(数量,百分比)。我遇到的问题是#2。该规范指出:

Tint:将效果颜色值移向或远离色调指定的量。

  • amt (Amount) - 指定颜色值的偏移量。
  • 色调(Hue) - 指定要着色的色调。

不用管 XML 构造,我可以模拟amt100% 的值。例如,如果我想要蓝色(色调:240°),我可以创建这个(有色的)。这是一个例子:

原始着色(色调 = 240,数量 = 100%)。
原来的 修改的

这可以通过将色调设置为 240、保持饱和度和亮度相同并转换为 RGB 并写入每个像素来实现。

这是我无法实现的目标:

色调 = 240蓝色),数量 = 30%50%80%,分别
30% 50% 80%

同样,规范Amount指定颜色值的偏移量。我在这里尝试了各种方法来让它工作,但似乎无法(hue=hue*amount,,originalhue * amount + hue等)

更多示例:Hue= 120 ( green ), Amount = 30% , 50% , 80%100%。我能得到的100% 。
30% 50% 80% 100%

以下是上图中单个像素的一些值列表:

像素 159、116 - 蓝色图片

        色相量 RGB | HSL
原始 244 196 10   |   48 0.92 0.5
蓝色 240 30% 237 30 45   | 356 0.85 0.52
蓝色 240 50% 245 9 156   | 323 0.93 0.5
蓝色 240 80% 140 12 244   | 273 0.91 0.5
蓝色 240 100% 12 12 244   | 240 0.91 0.5

像素 159、116 - 绿色图片

        色相量 RGB | HSL
原始 244 196 10   |   48 0.92 0.5
绿色 120 30% 211 237 30   |   68 0.85 0.52
绿色 120 50% 159 237 30   |   83 0.85 0.52
绿色 120 80% 81 237 29   | 105 0.85 0.52
绿色 120 100% 29 237 29   | 120 0.85 0.52


所以,问题是:有谁知道这应该如何工作?

注意:这不是以下内容的重复:

4

2 回答 2

6

我很确定您的问题是由您插入角度的方式引起的。这是一个可以解决问题的插值函数(用python编写)。它基于 xna 论坛主题Shortest 2D Angle Interpolation的建议。

def wrap(value, lower, upper):
    distance = upper - lower
    return value - ((value-lower)//distance)*distance

def shortestangle(a,b):
    angle = wrap(b-a, 0, 360)
    if angle>=180: angle -= 360
    return angle

def interpolate(a,b,amount):
    return (a+shortestangle(a,b)*amount)%360

现在,interpolate(originalHue,hue,amount)应该会产生预期的结果。

编辑:据我了解,您的目标是将原始色调向某个目标色调旋转一定量。我相信您已经对此很熟悉了,但为了便于说明,这里有一个色轮。

色轮
(来源:sapdesignguild.org

问题是混合(或插值)两个角度并非易事,因此类似代码hue = ((hue - originalHue) * amount) + originalHue将不起作用。由于 360° 环绕,您可以从一个角度到另一个角度有无数种方式。要从 0° 到 60°,您可以逆时针旋转 60°、逆时针旋转 420°、顺时针旋转 300° 等。通常最短的角度是所需的角度。

例如,让我们考虑企鹅的脖子:如果你的原始色调是 30°(橙色),你的目标是 240°(蓝色)并且数量是 50%,你会得到以下结果:

//Linear Interpolation
(30° + (240° - 30°)*0.5) = 135° (green)

//"Shortest 2D Angle Interpolation"
(30° + shortestangle(30°,240°)*0.5) % 360 = (30° + (-150°)*0.5) % 360 = 315° (magenta)

我的猜测是第二个结果是您正在寻找的结果,但我可能错了,错误可能完全在其他地方......

于 2010-06-25T23:33:21.117 回答
1

您应该查看 GDI+ 中的TintParams(虽然不是 .NET 的一部分)——这可能正是您正在寻找的。

于 2010-06-26T23:23:36.650 回答