106

I have a problem with displaying images in WPF.

Here's my code:

<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>

I have an image with original size 32*32, but when I ran the above code, the image will stretch to fill all the space, beyond its original size. I also set the "Stretch" property to "None", but it seems that it doesn't work.

So, how can I fix this problem? Thank you!

1
  • Verify the image DPI by displaying the following columns in the Windows File Explorer: Horizontal Resolution and Vertical Resolution.
    – Pressacco
    Commented Apr 10, 2021 at 13:47

5 Answers 5

135

Here is a similar question. Generally setting Stretch="None" is enough.

It is also very important what DPI has the image set in metadata. It took me quite a while before figuring out that if the image's DPI is different from the monitor's DPI (usually 96), WPF will automatically resize the image, as it tries to be DPI-independent.


EDIT

The MSDN link is broken, here is the new link: MSDN Blog - Blurry Bitmaps. Let's keep the old link around to be used for archive.org, in case the new link stops working also.

9
  • 10
    Great tip regarding DPI settings, Paja. Several of my toolbar icons had been set to 72 DPI, which causes them to appear larger even if the pixel dimensions are 16x16.
    – dthrasher
    Commented Mar 14, 2011 at 0:21
  • 1
    I don't understand. Are you saying WPF will layout your window differently depending on the resolution of the screen? There's no way that could possibly be a good thing. Commented Apr 18, 2017 at 15:49
  • @KyleDelaney Have you read the article I linked in the answer?
    – Paya
    Commented Apr 19, 2017 at 18:52
  • 1
    @KyleDelaney Yes, that's also why you use "points" instead of "pixels" to specify sizes, distances, margins etc in WPF.
    – Paya
    Commented Apr 24, 2017 at 8:23
  • 1
    @PawełAudionysos I have fixed the broken link
    – Paya
    Commented Feb 3, 2020 at 4:14
7

Try not specifying width or height, use it like this instead:

<Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" />
0
7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

This one works for me, for an image with 600x800 pixels and 96dpi.

@rishad2m8 If size is unknown one can detect the size first with https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx I'd guess.

3
  • 1
    what if image size is unknown?
    – rishad2m8
    Commented Nov 29, 2016 at 7:46
  • You're a saviour. You wouldn't want to know how long I was agonising over this issue. Commented Jun 5, 2017 at 20:53
  • 1
    UseLayoutRounding set to true worked for me! Thanks! Commented Oct 19, 2017 at 15:16
4

Adding to Paya's answer: to compensate WPF's attempt to adapt to the monitors resolution you should be able to set the Width and Height to the file's original dimensions and use Stretch="Fill". This worked for me.

0

If you want to display the image with original size, but don't know the image size, I think the best way is to set the image as background of UIElement. Like this:

    <Button Height="100" Width="100">
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>

Not the answer you're looking for? Browse other questions tagged or ask your own question.