在 WPFVisual
中你不能做任何事情,因为PixelShader
如果你的图像源的尺寸大于渲染尺寸,WPF 会损失质量。如果您的图像源的尺寸小于渲染尺寸,您可以使用PaddingTop
、PaddingBottom
和。只有一种方式,可以帮助您保存完整的质量:PaddingLeft
PaddingRight
使用Image
或ImageBrush
设置Stretch
为None
。通过这种方式,您将完整图像(Textura)发送到PixelShader
. 你必须有DependencyPRoperty
自定义ShaderEffect
:
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;
其中ViewWidth
èViewHeight
是渲染框架元素的大小,而FrameWidth
èFrameHeight
是源图像的大小这样,您可以在不损失质量的情况下调整输入图像的大小