WPF:如何以原始尺寸显示图像?


98

我在WPF中显示图像时遇到问题。

这是我的代码:

<Button HorizontalAlignment="Left" Grid.Column="1" Grid.Row="5" Margin="0,5">
        <Button.Content>
            <StackPanel Orientation="Horizontal" Margin="10,0">
                <Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" />
                <TextBlock Text="添加" />
            </StackPanel>
        </Button.Content>
    </Button>

我有一个原始尺寸为32 * 32的图像,但是当我运行上述代码时,该图像将拉伸以填充所有空间,超出其原始尺寸。我也将“ Stretch”属性设置为“ None”,但似乎不起作用。

那么,如何解决此问题?谢谢!

Answers:


127

是一个类似的问题。通常设置Stretch="None"就足够了。

DPI在元数据中设置图像也很重要。我花了很长时间才弄清楚,如果图像的DPI与显示器的DPI(通常为96)不同,WPF会自动调整图像的大小,因为它试图独立于DPI


编辑

MSDN链接已断开,这是新链接: MSDN博客-模糊位图。让我们保留旧链接以用于archive.org,以防新链接也无法正常工作。


10
关于DPI设置的绝佳提示,Paja。我的几个工具栏图标已设置为72 DPI,这使它们即使像素尺寸为16x16也显得更大。
dthrasher 2011年

我不明白 您是说WPF会根据屏幕分辨率以不同的方式布局窗口吗?没有办法可能是一件好事。
凯尔·德莱尼

@KyleDelaney您是否已阅读我在答案中链接的文章?
Paya

1
@KyleDelaney是的,这也是为什么在WPF中使用“点”而不是“像素”来指定大小,距离,边距等的原因。
Paya

1
@PawełAudionysos我已经修复了断开的链接
Paya

7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

这对我有用,对于具有600x800 pixels和的图像96dpi

@ rishad2m8如果大小未知,可以先使用https://msdn.microsoft.com/zh-cn/library/system.drawing.image.size(v=vs.110).aspx来检测大小。


1
如果图像大小未知怎么办?
rishad2m8

你是救世主。您可能不想知道我为此问题苦苦多久。
David Atkinson

1
UseLayoutRounding设置为true对我有用!谢谢!
布雷克·史塔德

6

尝试不指定宽度或高度,而是像这样使用它:

<Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" />

4

添加到Paya的答案中:为了补偿WPF尝试适应显示器分辨率的尝试,您应该能够将WidthHeight设置为文件的原始尺寸并使用Stretch="Fill"。这对我有用。


0

如果要以原始大小显示图像,但不知道图像大小,我认为最好的方法是将图像设置为UIElement的背景。像这样:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.