以一定的百分比着色或远离色调

Tod*_*ain 5 c# hsl gdi+ image

我正在尝试模拟Open XML 的Tint效果.它的作用是通过移动色调来改变图像中像素的色调.它需要2个参数:1)hue(以度为单位)和2)amt(数量,百分比).我遇到问题是#2.规范说明:

色调:根据指定的量将颜色值朝向或远离色调移动.

  • amt(Amount) - 指定颜色值的移位量.
  • hue(Hue) - 指定要着色的色调.

从不关注XML构造,我可以模拟具有amt100%的值.所以,例如,如果我想要蓝色(色调:240°),我可以创建它(有色的).这是一个例子:

原始着色(色调= 240,金额= 100%).
原版的 改性

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

这是我无法实现的:

色调= 240(蓝色),金额= 30% ,50%80%,分别
30% 50% 80%

再次,对于规范Amount说,通过颜色值多少转移指定.我已经试过各种方法在这里得到这个工作,但似乎无法(hue=hue*amount,originalhue * amount + hue,等)

更多实例:Hue = 120(绿色),数量= 30%,50%,80%100%.在100%的一个,我可以得到.
30% 50% 80% 100%

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

Pixel 159,116 - 蓝色图片

        Hue    Amount    R    G    B    | H    S     L
Original                 244  196   10  |  48  0.92  0.5
Blue    240     30%      237   30   45  | 356  0.85  0.52
Blue    240     50%      245    9  156  | 323  0.93  0.5
Blue    240     80%      140   12  244  | 273  0.91  0.5
Blue    240    100%       12   12  244  | 240  0.91  0.5

Pixel 159,116 - 绿色图片

        Hue    Amount    R    G    B    | H    S     L
Original                 244  196   10  |  48  0.92  0.5
Green    120     30%     211  237   30  |  68  0.85  0.52
Green    120     50%     159  237   30  |  83  0.85  0.52
Green    120     80%      81  237   29  | 105  0.85  0.52
Green    120    100%      29  237   29  | 120  0.85  0.52


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

注意:这不是重复:

klo*_*ffy 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
Run Code Online (Sandbox Code Playgroud)

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

编辑:据我了解,您的目标是将原始色调按某个给定量旋转到某个目标色调.我相信你已经熟悉了这个,但为了说明,这里是一个色轮.

色轮http://www.sapdesignguild.org/resources/glossary_color/images/color_wheel2.jpg

问题是混合(或插值)两个角度并不简单,因此代码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)
Run Code Online (Sandbox Code Playgroud)

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