我正在尝试模仿 色调效果 开放XML。它的作用是通过移动色调来改变图像中像素的色调。它需要2个参数:1) hue (以学位为单位)和2) amt (金额,百分比)。我遇到的是#2。规格指出:

着色: :Shifts效应颜色值以指定的数量向或远离色调。

  • amt (金额) - 指定颜色值的移动数量。
  • 色调 (色调) - 指定要着色的色调。

没关系XML结构,我可以模仿具有 amt 100%。因此,例如,如果我想要蓝色(色调:240°),我可以创建这个( 有色 一)。这是一个例子:

原来的有色 (色调= 240,金额= 100%)。
Original Modified

仅通过将色调设置为240来实现,使饱和度和亮度保持不变并转换为RGB并编写每个像素。

这是我无法实现的目标:

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

同样,规格 Amount指定颜色值移动多少. 。我在这里尝试了各种方法来使它起作用,但似乎无法(hue=hue*amount, originalhue * amount + hue, , ETC。)

更多示例:色调=120 (绿色),金额= 30%, 50%, 80%100%, , 分别。这 100% 一个我能得到的。
30% 50% 80% 100%

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

像素159,116-蓝色图片

        色调金额RGB | HSL
原始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

像素159,116-绿色图片

        色调金额RGB | HSL
原始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


因此,问题是:有人知道这应该如何工作吗?

注意:这是 不是 一个重复:

有帮助吗?

解决方案

我可以肯定的是,您的问题是从您插值角度的方式导致的。这是一个应该解决问题的插值功能(用python编写)。它基于XNA论坛线程的建议 最短的2D角插值.

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) 应该产生所需的结果。

编辑: 我的理解是,您的目标是将原始色调旋转到某个给定的量。我敢肯定,您已经对此已经熟悉了,但是为了插图,这是一个色轮。

Color Wheel
(来源: 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)

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

其他提示

你应该看看 Tintparams 在gdi+(虽然不是.NET的一部分)中 - 这可能就是您想要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top