WPF 用户控制色调级别

发布于 2024-11-26 22:00:41 字数 66 浏览 1 评论 0原文

我正在使用 WPFMediakit 和两个单色相机,我想更改这些控件的色调。是否可以单独对 wpf 控件进行色调操作?

I am using the WPFMediakit and I two monochrome cameras I want to change the hue's of these controls. Is it possible doing hue manupulation of wpf controls individually?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沫尐诺 2024-12-03 22:00:41

可以在灰度图像上使用的一个简单方法是在要着色的控件上方放置一个半透明矩形。此方法有以下方法没有的局限性。

例如,色调为蓝色

<Grid>
    <Image Source="C:\Windows\Web\Wallpaper\img1.jpg" />
    <Rectangle Fill="#86004EFF" />
</Grid>

由于灰色没有饱和度,因此改变灰度图像的色调不会产生任何效果,像 这个 不会帮助你。不过,您可以调整该效果,使其行为类似于 Photoshop 中的着色功能,如下所示:

/// <summary>Hue</summary>
/// <minValue>0</minValue>
/// <maxValue>1</maxValue>
/// <defaultValue>0</defaultValue>
float Hue : register(c0);

/// <summary>Saturation</summary>
/// <minValue>0</minValue>
/// <maxValue>1</maxValue>
/// <defaultValue>0</defaultValue>
float Saturation : register(c1);

sampler2D Samp : register(S0);
float3 hsv_to_rgb(float3 HSV)
{
    float3 RGB = HSV.z;
    float var_h = HSV.x * 6;
    float var_i = floor(var_h);   // Or ... var_i = floor( var_h )
    float var_1 = HSV.z * (1.0 - HSV.y);
    float var_2 = HSV.z * (1.0 - HSV.y * (var_h-var_i));
    float var_3 = HSV.z * (1.0 - HSV.y * (1-(var_h-var_i)));
    if      (var_i == 0) { RGB = float3(HSV.z, var_3, var_1); }
    else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); }
    else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); }
    else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); }
    else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); }
    else                 { RGB = float3(HSV.z, var_1, var_2); }
   return (RGB);
}

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 col = tex2D(Samp, uv);
    float gray = col.r*0.3 + col.g*0.59 + col.b * 0.11;
    return float4(hsv_to_rgb(float3(Hue,Saturation,gray)),col.w);
}

查看 Shazzam 以使用自定义效果。

A simple method that you can use on grayscale images is to put a semi-transparent rectangle above the control you want to tint. This method has limitations which the method below doesn't.

e.g to tint blue

<Grid>
    <Image Source="C:\Windows\Web\Wallpaper\img1.jpg" />
    <Rectangle Fill="#86004EFF" />
</Grid>

As gray has no saturation changing the hue of a grayscale image won't do anything, a hue shift like this one wouldn't help you. You could however adjust that effect so it behaves like the colourize feature in Photoshop like this:

/// <summary>Hue</summary>
/// <minValue>0</minValue>
/// <maxValue>1</maxValue>
/// <defaultValue>0</defaultValue>
float Hue : register(c0);

/// <summary>Saturation</summary>
/// <minValue>0</minValue>
/// <maxValue>1</maxValue>
/// <defaultValue>0</defaultValue>
float Saturation : register(c1);

sampler2D Samp : register(S0);
float3 hsv_to_rgb(float3 HSV)
{
    float3 RGB = HSV.z;
    float var_h = HSV.x * 6;
    float var_i = floor(var_h);   // Or ... var_i = floor( var_h )
    float var_1 = HSV.z * (1.0 - HSV.y);
    float var_2 = HSV.z * (1.0 - HSV.y * (var_h-var_i));
    float var_3 = HSV.z * (1.0 - HSV.y * (1-(var_h-var_i)));
    if      (var_i == 0) { RGB = float3(HSV.z, var_3, var_1); }
    else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); }
    else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); }
    else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); }
    else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); }
    else                 { RGB = float3(HSV.z, var_1, var_2); }
   return (RGB);
}

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 col = tex2D(Samp, uv);
    float gray = col.r*0.3 + col.g*0.59 + col.b * 0.11;
    return float4(hsv_to_rgb(float3(Hue,Saturation,gray)),col.w);
}

Check out Shazzam for working with custom effects.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文