我正在尝试模拟Open XML 的Tint效果.它的作用是通过移动色调来改变图像中像素的色调.它需要2个参数:1)hue(以度为单位)和2)amt(数量,百分比).我遇到问题是#2.规范说明:
色调:根据指定的量将颜色值朝向或远离色调移动.
- amt(Amount) - 指定颜色值的移位量.
- hue(Hue) - 指定要着色的色调.
从不关注XML构造,我可以模拟具有amt100%的值.所以,例如,如果我想要蓝色(色调:240°),我可以创建它(有色的).这是一个例子:
原始和着色(色调= 240,金额= 100%).

这可以通过将色调设置为240,保持饱和度和亮度相同并转换为RGB并写入每个像素来实现.
这是我无法实现的:
色调= 240(蓝色),金额= 30% ,50%和80%,分别

再次,对于规范Amount说,通过颜色值多少转移指定.我已经试过各种方法在这里得到这个工作,但似乎无法(hue=hue*amount,originalhue * amount + hue,等)
更多实例:Hue = 120(绿色),数量= 30%,50%,80%和100%.在100%的一个,我可以得到.

以下是上图中单个像素的一些值列表:
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
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
所以,问题是:有谁知道这应该如何工作?
注意:这不是重复:
- 在保持整体亮度的同时更改位图的色调
- 使用C#中的ImageAttributes旋转Hue
- ......或者我能在SO上找到的任何其他东西
我很确定你的问题是由你插入角度的方式产生的.这是一个插值函数(用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)
我的猜测是第二个结果是你要找的那个,但我可能错了,错误可能完全在其他地方......
| 归档时间: |
|
| 查看次数: |
790 次 |
| 最近记录: |