C# UWP中的位图平滑

C# UWP中的位图平滑,c#,xaml,uwp,C#,Xaml,Uwp,我试图找出如何在UWP中调整图像大小而不丢失质量。我知道在WPF中有一个选项可以使用此选项平滑图像:RenderOptions.BitmapScalingMode=“HighQuality”,但我似乎在UWP中找不到类似的选项 以下是图像的外观: 它应该是什么样子的: 如果你仔细观察,你会发现这张图片的像素化程度很差。我如何在UWP中实现这一点 我正在按XAML(圆形裁剪)调整它的大小: 在ImageBrush和BitmapImage中,我似乎找不到任何其他设置来实现此功能。作为一种优化,框

我试图找出如何在UWP中调整图像大小而不丢失质量。我知道在WPF中有一个选项可以使用此选项平滑图像:
RenderOptions.BitmapScalingMode=“HighQuality”
,但我似乎在UWP中找不到类似的选项

以下是图像的外观:

它应该是什么样子的:

如果你仔细观察,你会发现这张图片的像素化程度很差。我如何在UWP中实现这一点

我正在按XAML(圆形裁剪)调整它的大小:


ImageBrush
BitmapImage
中,我似乎找不到任何其他设置来实现此功能。

作为一种优化,框架通常会以较小的分辨率解码图像,以匹配屏幕上显示的目标
图像
元素的大小,但只有当框架能够直接确定目标图像的大小时,才会出现这种情况。如果框架无法推断出这一点,那么它将以全分辨率加载图像,并由GPU进行缩放,而GPU可能具有破旧的线性插值,这使得图像在缩放时看起来很粗糙

我认为这就是您的示例中发生的情况,因为
ImageBrush
不知道应用它的
椭圆的大小。(这是一种显示图像的自定义方式。)

由于您提前知道
椭圆的大小
,因此可以明确地告诉框架以指定的分辨率解码图像

<!-- Bad: image will be full resolution -->
<Ellipse Width="50" Height="50">
    <Ellipse.Fill>
        <ImageBrush Stretch="UniformToFill" ImageSource="Assets/Cat.jpg"/>
    </Ellipse.Fill>
</Ellipse>

<!-- Better: image is scaled down nicely and uses less memory -->
<Ellipse Width="50" Height="50">
    <Ellipse.Fill>
        <ImageBrush Stretch="UniformToFill">
            <ImageBrush.ImageSource>
                <BitmapImage UriSource="Assets/Cat.jpg" DecodePixelType="Logical" DecodePixelWidth="50"/>
            </ImageBrush.ImageSource>
        </ImageBrush>
    </Ellipse.Fill>
</Ellipse>


更多信息。

调整图像大小时,不要使用点采样过滤器。使用双线性滤波代替,或者其他一些滤波器,如果这还不够的话。此外,如果您需要代码方面的帮助,发布代码通常是有帮助的。您的大小调整代码在哪里?我没有使用任何类型的大小调整过滤方法,我只是想看看是否有办法在XAML中实现。原始图像大小是多少?我的图片大小不同。虽然这可以提高图像质量,但仍然不允许您选择插值模式。您必须在运行时设置
ImageSource
,使用
位图编码器来生成调整大小的图像。这允许您专门设置。谢谢!现在照片看起来好多了!:)您知道如何使用BitmapIcon元素实现类似的功能吗?
personImage.ImageSource = new BitmapImage(new Uri("http://lorempixel.com/500/500/"));
<!-- Bad: image will be full resolution -->
<Ellipse Width="50" Height="50">
    <Ellipse.Fill>
        <ImageBrush Stretch="UniformToFill" ImageSource="Assets/Cat.jpg"/>
    </Ellipse.Fill>
</Ellipse>

<!-- Better: image is scaled down nicely and uses less memory -->
<Ellipse Width="50" Height="50">
    <Ellipse.Fill>
        <ImageBrush Stretch="UniformToFill">
            <ImageBrush.ImageSource>
                <BitmapImage UriSource="Assets/Cat.jpg" DecodePixelType="Logical" DecodePixelWidth="50"/>
            </ImageBrush.ImageSource>
        </ImageBrush>
    </Ellipse.Fill>
</Ellipse>