WPF: ¿Cómo mostrar una imagen en su tamaño original?

98

Tengo un problema con la visualización de imágenes en WPF.

Aquí está mi código:

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

Tengo una imagen con el tamaño original 32 * 32, pero cuando ejecuté el código anterior, la imagen se estirará para llenar todo el espacio, más allá de su tamaño original. También configuré la propiedad "Stretch" en "None", pero parece que no funciona.

Entonces, ¿cómo puedo solucionar este problema? ¡Gracias!

jiluo
fuente

Respuestas:

127

He aquí una pregunta similar. Generalmente el ajuste Stretch="None"es suficiente.

También es muy importante qué DPI tiene la imagen configurada en metadatos. Me tomó bastante tiempo antes de darme cuenta de que si el DPI de la imagen es diferente del DPI del monitor (generalmente 96), WPF cambiará automáticamente el tamaño de la imagen, ya que intenta ser independiente de DPI .


EDITAR

El enlace de MSDN está roto, aquí está el nuevo enlace: Blog de MSDN - Mapas de bits borrosos . Conservemos el enlace anterior para usarlo en archive.org, en caso de que el nuevo enlace también deje de funcionar.

Paya
fuente
10
Gran consejo con respecto a la configuración de DPI, Paja. Varios de los íconos de mi barra de herramientas se establecieron en 72 DPI, lo que hace que parezcan más grandes incluso si las dimensiones de los píxeles son 16x16.
dthrasher
No entiendo. ¿Estás diciendo que WPF distribuirá tu ventana de manera diferente dependiendo de la resolución de la pantalla? No hay forma de que eso pueda ser algo bueno.
Kyle Delaney
@KyleDelaney ¿Ha leído el artículo que vinculé en la respuesta?
Paya
1
@KyleDelaney Sí, por eso también usa "puntos" en lugar de "píxeles" para especificar tamaños, distancias, márgenes, etc. en WPF.
Paya
1
@ PawełAudionysos He arreglado el enlace roto
Paya
7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

Este me funciona, para una imagen con 600x800 pixelsy 96dpi.

@ rishad2m8 Si se desconoce el tamaño, uno puede detectar el tamaño primero con https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx , supongo.

Ulrich-Lorenz Schlüter
fuente
1
¿Qué pasa si se desconoce el tamaño de la imagen?
rishad2m8
Eres un salvador. No querrás saber cuánto tiempo estuve agonizando por este tema.
David Atkinson
1
UseLayoutRounding establecido en verdadero funcionó para mí. ¡Gracias!
Blake Thingstad
6

Intente no especificar el ancho o el alto, utilícelo así:

<Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" />
Niño Voodoo
fuente
4

Agregando a la respuesta de Paya: para compensar WPFel intento de adaptarse a la resolución de los monitores, debería poder configurar el Widthy Heightlas dimensiones y uso originales del archivo Stretch="Fill". Esto funcionó para mí.

perdonmissjackson
fuente
0

Si desea mostrar la imagen con el tamaño original, pero no conoce el tamaño de la imagen, creo que la mejor manera es establecer la imagen como fondo de UIElement. Me gusta esto:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
shirley
fuente