c# - 使用不同大小的像素着色器采样器创建 WPF 效果

标签 c# wpf effect pixel-shader

我想创建一种效果,我使用相当大的图像通过 WPF 效果使用 HLSL 生成较小的图像。但似乎 WPF 出于某种原因将所有输入图像的大小调整为呈现的大小,这不是我想要的,因为它会大量裁剪我的一张图像并使我的最终图像看起来不太好。

我是这样设置的。 我有一个在 MediaElement 中播放的大小为 2592x1944 的图像(视频)。 我将我的效果应用于大小为 800x600 的边框(或其他元素),并将 MediaElement 绑定(bind)到效果,以便能够将要渲染的表面(边框)和要渲染的源(MediaElement)发送到像素着色器。

但是由于源的大量裁剪,生成的图像非常像素化。

有谁知道是否有办法让 WPF 不裁剪像素着色器样本?

我发现 Greg Schecter 的这篇博文有点符合我的要求,但反过来: http://blogs.msdn.com/b/greg_schechter/archive/2008/09/27/a-more-useful-multi-input-effect.aspx 他缩小了图像,但我想我想把它变大。问题是他使用的是 ImageBrush,而我使用的是 VisualBrush,因为我使用的是 UIElements 而不是图像。不知道是否有办法完成他在 VisualBrush 上所做的事情。

最佳答案

在 WPF Visual 中,您无能为力,因为如果图像源的大小大于渲染大小,WPF PixelShader 会失去质量。如果您的图像源的大小小于渲染大小,您可以使用 PaddingTopPaddingBottomPaddingLeftPaddingRight .只有一种方式,可以帮助您保存 FULL 质量:

使用ImageImageBrush 并将Stretch 设置为None。通过这种方式,您可以将完整图像 (Textura) 发送到 PixelShader。您必须在自定义 ShaderEffect 中具有 DependencyPROperty:

public static readonly DependencyProperty ViewAspectProperty = DependencyProperty.Register(nameof(ViewAspect), typeof(Point), typeof(CustomEffect), new UIPropertyMetadata(new Point(1D, 1D), PixelShaderConstantCallback(0)));

    public Point ViewAspect
    {
        get => (Point)GetValue(ViewAspectProperty);
        set => SetValue(ViewAspectProperty, value);
    }

在 Shader.fs 中:

float2 ViewAspect : register(C0) = float2(1, 1);
sampler2D Input : register(s0);

struct VS_OUTPUT
{
    float4 Position : POSITION;
    float4 Color : COlOR;
    float2 UV : TEXCOORD;
};

float4 main(VS_OUTPUT input) : COlOR
{
  float2 uv = input.UV;  

    uv.x *= ViewAspect.x;
    uv.y *= ViewAspect.y;

    return tex2D(Input, uv);
}

当您的渲染控件将更改您需要的大小时:

        ViewAspectX = ViewWidth > 0 ? FrameWidth / ViewWidth : 1;
        ViewAspectY = ViewHeight > 0 ? FrameHeight / ViewHeight : 1;

其中 ViewWidthViewHeight 是渲染 FrameworkElement 的大小,FrameWidthFrameHeight 是源图像的大小通过这种方式,您可以在不损失质量的情况下调整输入图像的大小

关于c# - 使用不同大小的像素着色器采样器创建 WPF 效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18920205/

相关文章:

c# - 用于 Visual Studio 2008 外观的 ToolStripProfessionalRenderer

wpf - OnApplyTemplate 之前加载事件

WPF:如何制作 "pushlike"复选框?

javascript - 带有 css 转换的 ToggleClass

php - 如何创建 PHP 内联悬停效果?

c# - EF 4.3 CodeFirst MVC3 WebApp 和控制台使用相同的模型,但不知何故它们 'see' 是导致模型支持错误的不同模型

c# - C# 中的高效图像处理

c# - 我用于收藏的 key 是否需要满足任何要求?

c# - 当受影响的控件被隐藏时,WPF Storyboard动画是否继续运行?

java - 在 Java 上的 JForm 中滑动 JPanel 内容