代码之家  ›  专栏  ›  技术社区  ›  Todd Main

对色调上色或不上色一定百分比

  •  5
  • Todd Main  · 技术社区  · 14 年前

    我正在尝试模拟open-xml的 tint effect 它的作用是通过改变色调来改变图像中像素的色调。它需要2个参数:1)The hue(色调) (in degrees)and 2)the amt(金额,百分比)。我有问题的是2。规格说明:

    < Buff行情>

    tint :通过 指定金额。.

    • amt (amount)-指定颜色值移动的程度。
    • hue (hue)-指定要着色的色调。
    < /块引用>

    不必考虑XML结构,我可以模拟具有 amt 100%的值。因此,例如,如果我想要蓝色(色调:240°),我可以创建这个(the tinted. one)。举个例子:

    original and tintered (hue=240,amount=100%).

    这只需将色调设置为240,保持饱和度和亮度不变,然后转换为RGB并写入每个像素即可实现。

    但我无法实现的是:

    色调= 240 ( BLUE >),amount= 30% , 50% and 80% ,respectively

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

    更多示例:hue= 120 ( green- ),amount= 30% , 50% , 80% and 100% ,respectively. 100% one I can get.

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

    像素159116-蓝色图片

    < PRE> 色调量r g b_h s l 原版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

    像素159116-绿色图片

    < PRE> 色调量r g b_h s l 原版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
    所以,问题是:有人知道这应该如何工作吗?

    < Buff行情>

    注意:这是

    < /块引用开放XML的。它的作用是通过改变色调来改变图像中像素的色调。它需要2个参数:1) hue (单位:度)和2) amt (金额,百分比)。我有问题的是2。规范规定:

    明调 :按 指定金额。

    • AMT (amount)-指定颜色值的偏移量。
    • 色调 (色调)-指定要着色的色调。

    从不考虑XML结构,我可以模拟具有 AMT 100%。例如,如果我想要蓝色(色调:240度),我可以创建这个 着色的 一)。下面是一个例子:

    原件 着色的 (色调=240,数量=100%)。
    Original Modified

    这只需将色调设置为240,保持饱和度和亮度不变,然后转换为RGB并写入每个像素即可实现。

    以下是我无法实现的目标:

    色调= 二百四十 ( 蓝色 ) 30% , 50% 80% ,分别
    30% 50% 80%

    同样,规范 Amount 指定颜色值的偏移量 . 我已经尝试了各种方法来让这个工作,但似乎不能( hue=hue*amount , originalhue * amount + hue 等)

    更多示例:色调= 一百二十 ( 绿色 ) 30% , 50% , 80% 100% ,分别。这个 100% 我能得到一个。
    30% 50% 80% 100%

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

    像素159116-蓝色图片

            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
    
    

    像素159116-绿色图片

            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
    


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

    注:这是 复制品:

    2 回复  |  直到 14 年前
        1
  •  6
  •   kloffy    14 年前

    我很肯定你的问题是由你插入角度的方式造成的。这是一个插值函数(用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) 应产生所需的结果。

    编辑: 我的理解是,你的目标是将原始色调旋转到某个给定数量的目标色调。我敢肯定你已经熟悉这个了,但为了举例说明,这里有一个色轮。

    Color Wheel 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)
    

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

        2
  •  1
  •   Stan    14 年前

    你应该看看 TintParams 在gdi+中(虽然不是.NET的一部分)-这可能正是您要寻找的。