WPF: Bagaimana cara menampilkan gambar dengan ukuran aslinya?

98

Saya punya masalah dengan menampilkan gambar di WPF.

Ini kode saya:

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

Saya memiliki gambar dengan ukuran asli 32 * 32, tetapi ketika saya menjalankan kode di atas, gambar akan meregang untuk mengisi semua ruang, melebihi ukuran aslinya. Saya juga menyetel properti "Regangkan" ke "Tidak Ada", tetapi tampaknya properti itu tidak berfungsi.

Jadi, bagaimana cara mengatasi masalah ini? Terima kasih!

jiluo
sumber

Jawaban:

127

Ini pertanyaan serupa. Umumnya setting Stretch="None"sudah cukup.

Juga sangat penting DPI mengatur gambar dalam metadata. Butuh waktu cukup lama sebelum saya mengetahui bahwa jika DPI gambar berbeda dari DPI monitor (biasanya 96), WPF akan secara otomatis mengubah ukuran gambar, karena mencoba untuk tidak bergantung pada DPI .


EDIT

Link MSDN rusak, ini link barunya: MSDN Blog - Blurry Bitmaps . Mari simpan tautan lama agar digunakan untuk archive.org, jika tautan baru juga berhenti berfungsi.

Paya
sumber
10
Tip bagus tentang pengaturan DPI, Paja. Beberapa ikon toolbar saya telah disetel ke 72 DPI, yang menyebabkannya tampak lebih besar meskipun dimensi pikselnya 16x16.
dthrasher
Saya tidak mengerti. Apakah Anda mengatakan WPF akan mengatur tata letak jendela Anda berbeda tergantung pada resolusi layar? Tidak mungkin itu bisa menjadi hal yang baik.
Kyle Delaney
@KeDelanAnda sudah membaca artikel yang saya tautkan di jawaban?
Paya
1
@KyleDelaney Ya, itu juga mengapa Anda menggunakan "poin" daripada "piksel" untuk menentukan ukuran, jarak, margin, dll di WPF.
Paya
1
@ PawełAudionysos Saya telah memperbaiki tautan yang rusak
Paya
7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

Yang ini bekerja untuk saya, untuk gambar dengan 600x800 pixelsdan 96dpi.

@ rishad2m8 Jika ukuran tidak diketahui, seseorang dapat mendeteksi ukuran terlebih dahulu dengan https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx saya kira.

Ulrich-Lorenz Schlüter
sumber
1
bagaimana jika ukuran gambar tidak diketahui?
rishad2m8
Anda seorang penyelamat. Anda tidak ingin tahu berapa lama saya menderita karena masalah ini.
David Atkinson
1
UseLayoutRounding disetel ke true berhasil untuk saya! Terima kasih!
Blake Thingstad
6

Cobalah untuk tidak menentukan lebar atau tinggi, gunakan seperti ini:

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

Menambah jawaban Paya: untuk mengimbangi WPFupaya beradaptasi dengan resolusi monitor, Anda harus dapat mengatur Widthdan Heightke dimensi dan penggunaan asli file Stretch="Fill". Ini berhasil untuk saya.

maafmissjackson
sumber
0

Jika Anda ingin menampilkan gambar dengan ukuran aslinya, tetapi tidak mengetahui ukuran gambar, menurut saya cara terbaik adalah dengan mengatur gambar tersebut sebagai background UIElement. Seperti ini:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
Shirley
sumber