Wpf 如何使图像不拉伸?

Wpf 如何使图像不拉伸?,wpf,xaml,Wpf,Xaml,[imgur已删除图像] 左侧的图标是此代码的结果: <Button Height="23" HorizontalAlignment="Left" Margin="12,276,0,0" Name="button1" VerticalAlignment="Top" Width="75"> <StackPanel Orientation="Horizontal"> <Image Source="Resources/add

[imgur已删除图像]

左侧的图标是此代码的结果:

    <Button Height="23" HorizontalAlignment="Left" Margin="12,276,0,0" Name="button1" VerticalAlignment="Top" Width="75">
        <StackPanel Orientation="Horizontal">
            <Image Source="Resources/add.png" Stretch="None" />
            <TextBlock Margin="5,0,0,0" Text="Add" />
        </StackPanel>
    </Button>

右边的那张是用Photoshop放在旁边的原始图像。看起来,通过代码添加的一个像素被拉伸,导致了一些失真。如何防止这种情况发生?

Stretch=“None”
应该做到这一点。如果图像的显示方式存在差异,这可能是由于像素位于“边缘”造成的


您可以尝试设置
=“True”
来避免这种情况。

我看不出您的示例中发生了什么,但WPF出现这种问题的一个常见原因是PNG文件中的DPI值不是96(如果它来自任何具有Mac传统的文件,通常是72).

尝试使用
渲染。BitmapScalingMode=“NearestNeighbor”

您可能需要阅读以下内容:


实际上,NearestNeighbor将允许引擎在缩放时跳过源图像中的像素。如果有一个线性的选项,这可能会更好,因为它意味着从源图像逐像素缩放读取。

这为我修复了它:

在根元素(即主窗口)上添加以下属性:
UseLayoutRounding=“True”


我只是通过明确设置宽度或高度来解决这个问题。因此,如果您知道图像有48像素高,请执行以下操作:

<Image Source="myImage.png" Height="48" UseLayoutRounding="True"/>

添加拉伸=无可防止图像重新压缩

<ImageBrush ImageSource="rtgEnhanced.png" AlignmentX="Left" AlignmentY="Bottom" Stretch="None"></ImageBrush>

PNG图像中可以存储称为pHYs块的内容。此区块定义图像要显示的DPI。如果图像的DPI与显示器的DPI不匹配,WPF将对其进行拉伸,以使其以“预期”大小显示。这通常(至少对我来说)根本不是我想要的,会引起很多挫折

为了删除“预期的”拉伸,一个选项是从PNG中删除pHYs块

您可以使用类似的工具来检查和删除PHY


或者,您可以简单地使用编码正确的DPI保存图像,或者根本不保存图像,前提是您的图像编辑软件支持此功能。

如果在xaml中显式设置宽度和高度属性,会发生什么情况?@Eugen:也尝试过。不会改变任何事情。如果我将它设置为少一个像素,它将成为正确的大小,但由于缩放,它仍然模糊。图像已损坏…@itsho:Imgur一定已将其删除。对不起,我没有另一份给你。它和这个很相似:不。。。那也不行。设置附加属性:
RenderOptions.BitmapScalingMode=“HighQuality”
(或者其他一些值)怎么样?@HB:不应该进行缩放,但尽管如此,还是尝试了,看起来还是一样。正如Velja Matic指出的,我认为在这种情况下,
最近的邻居实际上是一个不错的选择。它仍在缩放,此属性不受拉伸的影响。那么,如何检查DPI值,以及如何修复它?这是Fam丝绸图标集中未编辑的图标。@标记,在Photoshop中,使用“图像/调整大小…”并首先取消选中“重采样”。然后输入新的像素/英寸值并按“确定”。图像的像素尺寸不会改变,但在保存PNG时会写入新的元数据。事实上,dpi不等于96意味着当Image.Stretch=“None”时,WPF不会使用本机像素大小。非常感谢Will提供了这个很棒的修复。如果有人需要一个用于DPI校正的工具:您可以使用,这是免费的,并且很容易用于此目的。
UseLayoutRounding
,正如您的第一个链接所建议的那样。第二种解释很好。谢谢你是完全正确的,如果你阅读我在接受答案下面留下的评论,你会发现这也是我发现的。我标记它是正确的,因为他建议的
UseLayoutRounding
修复了它。PNGOOptimizer为我做了这个技巧: