Wpf 如何使图像不拉伸?
[imgur已删除图像] 左侧的图标是此代码的结果: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
<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”
您可能需要阅读以下内容:
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为我做了这个技巧: