题
我正在尝试模仿 色调效果 开放XML。它的作用是通过移动色调来改变图像中像素的色调。它需要2个参数:1) hue
(以学位为单位)和2) amt
(金额,百分比)。我遇到的是#2。规格指出:
着色: :Shifts效应颜色值以指定的数量向或远离色调。
- amt (金额) - 指定颜色值的移动数量。
- 色调 (色调) - 指定要着色的色调。
没关系XML结构,我可以模仿具有 amt
100%。因此,例如,如果我想要蓝色(色调:240°),我可以创建这个( 有色 一)。这是一个例子:
原来的 和 有色 (色调= 240,金额= 100%)。
仅通过将色调设置为240来实现,使饱和度和亮度保持不变并转换为RGB并编写每个像素。
这是我无法实现的目标:
色调=240 (蓝色的),金额= 30%, 50% 和 80%, , 分别
同样,规格 Amount
说 指定颜色值移动多少. 。我在这里尝试了各种方法来使它起作用,但似乎无法(hue=hue*amount
, originalhue * amount + hue
, , ETC。)
更多示例:色调=120 (绿色),金额= 30%, 50%, 80% 和 100%, , 分别。这 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
因此,问题是:有人知道这应该如何工作吗?
注意:这是 不是 一个重复:
- 更改位图的色调,同时保留整体亮度
- 使用C#中的成像培养地旋转色调
- ...或我能找到的其他任何东西
解决方案
我可以肯定的是,您的问题是从您插值角度的方式导致的。这是一个应该解决问题的插值功能(用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)
应该产生所需的结果。
编辑: 我的理解是,您的目标是将原始色调旋转到某个给定的量。我敢肯定,您已经对此已经熟悉了,但是为了插图,这是一个色轮。
(来源: 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的一部分)中 - 这可能就是您想要的。