【问题标题】:Green screen in WPFWPF中的绿屏
【发布时间】:2014-08-07 14:12:57
【问题描述】:

我们有一个视频需要在一个按钮中显示,但是我们想让按钮的背景显示出来,并且我们不能把背景放在视频中,因为按钮可以改变大小,而背景需要拉伸到按钮的大小,而不是视频的大小。视频必须保持其大小比例,所以我想知道是否有办法在 WPF 中执行类似绿屏的操作,因此我们可以在视频上放置绿色背景,并让按钮忽略它以显示自己的背景。

我知道这是一个很长的尝试,但非常欢迎任何建议。

谢谢!

【问题讨论】:

    标签: wpf video


    【解决方案1】:

    好的,我找到了解决方案。 4 个简单的步骤。

    1) 下载安装Shader Effects BuildTask and Templates

    2) 下载WPF Pixel Shader library。在 MainSolution 文件夹中打开解决方案,然后右键单击 WPFShaderEffectLibrary 进行编译,然后将编译后的 DLL 的引用添加到您的项目中。注意:仅编译 WPFShaderEffectLibrary,如果您尝试编译整个解决方案,它可能无法正常工作。

    3) 按如下方式使用像素着色器(我在 MainWindow 构造函数中使用它,但这并不重要):

    public MainWindow()
    {
        InitializeComponent();
    
        ColorKeyAlphaEffect effect = new ColorKeyAlphaEffect();
    
        Brush brush = Effect.ImplicitInput;
    
        effect.Input = brush;
    
        // This is the Image control in your xaml. It should contain 
        // the image in which you want the green screen effect
        imageControl.Effect = effect;
    }
    

    你需要这个库:

    using System.Windows;
    using System.Windows.Media;
    using System.Windows.Media.Effects;
    using ShaderEffectLibrary;
    

    4) 着色器仅适用于黑色,因此您需要更改一些内容以使其适用于绿色(或您喜欢的任何其他颜色),就我而言,我希望使其适用于绿色(例如一个绿屏),所以我改变了效果的值。在您从 Codeplex 下载的解决方案中,您必须转到 WPFShaderEffectLibrary 项目 -> ShaderSource 文件夹 ColorKeyAlpha.fx 文件。在那里,您必须更改以下代码:

        float4 main(float2 uv : TEXCOORD) : COLOR
        {
           float4 color = tex2D( implicitInputSampler, uv );
    
           // FROM THIS
           if( color.r + color.g + color.b < 0.3 ) {
              color.rgba = 0;
           }
    
           return color;
        }
    

    到这里

    float4 main(float2 uv : TEXCOORD) : COLOR
    {
       float4 color = tex2D( implicitInputSampler, uv );
    
       // TO THIS
       if( color.r == 0 && color.g == 1.0 && color.b == 0 ) {
          color.rgba = 0;
       }
    
       return color;
    }
    

    完成后,重新编译 WPFShaderEffectLibrary 项目,并更新项目中的引用(第 2 步中的那个)。更新参考后,PixelShader 将开始使绿色值(R = 0,G = 255,B = 0)完全透明。它适用于图像和视频。

    我真的很难做到这一点,我希望它对阅读本文的人有用:)。

    谢谢!

    【讨论】:

    • 哦,伙计,我想我已经没有它了……你有没有发现任何并发症?
    • 是的...我找到了所有东西...没关系。我面临的问题在这里stackoverflow.com/questions/13879362/mediaelement-freezes-video 你能提出一些建议吗?所以我使用 Shader DLL 并使用一些东西,比如 TransitionEffect effect = new RippleTransitionEffect();并重置动画 this.Player1.Effect = null;但是当我最大。全屏动画中的 WPF 窗口完全冻结。 (我使用 2 个 MedieElement。)
    • 我知道这是一个很老的问题,但是当我尝试做你所做的事情时,视频绿屏没有被替换,而且,Visual Studio 抱怨“用户指定的像素着色器无效”跨度>
    【解决方案2】:

    搜索“chromakey wpf effect”以获得各种示例

    【讨论】:

    • 哈哈,我搜索了那个,我得到的只是这个答案的链接。还有其他建议吗?
    • 找到并发布了答案。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多