2016-08-24 2 views
3

Schnelle Frage:Warum ändert dieses Bitmap-Bild seine Größe, nachdem ich es geladen habe?

Ich habe diese 1000 x 1000 Bitmap-Bild:

enter image description here

und ich diese Routine verwenden, um es zu laden:

private BitmapSource initialBitmap = new BitmapImage(new Uri("C:\\Users\\...\\Desktop\\Original.bmp")); 

Warum, nachdem ich es laden , und direkt nachdem ich über die obige Linie getreten bin, sehe ich es als 800 x 800?

enter image description here

P.S ich es sein will 1000 x 1000 und ohne Resize-Funktionen. Es hat funktioniert und plötzlich ist es 800 * 800!

+0

Vielleicht einige DPI Problem es ist. Ich möchte nicht mehr sagen, weil ich es hasse, an DPI zu denken – musefan

+0

@musefan Ich bin immer noch auf der gleichen Maschine. Es funktionierte und wurde als 1000x1000 geladen. Sobald ich ein altes Bild (aus Versehen) löschte und ein neues erstellte, begann es als 800x800 –

+1

gut geladen werden ... in diesem Fall muss es gut funktionieren und es gibt kein Problem, dann ... – musefan

Antwort

4

Die zurückgegebenen Werte von BitmapSource.Width und BitmapSource.Height sind nicht in Pixel, sondern WPF geräteunabhängige Einheiten, die immer 96 dpi sind . Zum Beispiel:

Ruft die Breite der Bitmap in geräteunabhängigen Einheiten (1/96 Zoll pro Einheit) ab.

Wenn Sie die tatsächliche Pixelbreite und -höhe wissen wollen, müssen Sie die PixelWidth und PixelHeight Eigenschaften verwenden.

Ihre Frage ist nicht sehr spezifisch, aber wenn Sie tatsächlich daran interessiert sind, die Bitmap-Anzeige in der gleichen Größe zu haben, in der sie erstellt wurde, dann ist die einfachste Lösung, sie mit 96 dpi zu erstellen. Welches Programm Sie auch verwenden, um die Bitmap zu erstellen, hat wahrscheinlich einen Platz, an dem Sie die Bitmap-Auflösung einstellen können. Typischerweise kann dies eingestellt werden mit oder ohne Ändern der Pixelabmessungen des Bildes (d. H. Skalieren des Bildes größer oder kleiner); Sie möchten dies tun, ohne das Bild zu skalieren, so dass die Pixelabmessungen gleich bleiben, aber die dpi-Werte so geändert werden, dass sie mit denen von WPF übereinstimmen.

Beachten Sie, dass dies die Bitmap-Anzeigen bei einer bestimmten Pixelgröße immer noch nicht garantiert. Die Bildschirmauflösung kann 96 dpi und ist oft unterschiedlich. In diesem Fall skaliert WPF Bilder, um sicherzustellen, dass die physischen Abmessungen des Bildes (dh die Abmessungen in Zoll, Millimeter usw.) entsprechend den Informationen in der Bitmap korrekt sind . Beispielsweise bedeutet 960 Pixel Breite bei 96 dpi eine Breite von 10 Zoll. Auf einer 120 dpi-Anzeige bedeutet dies, dass die Bitmap groß genug ist, so dass ihre Breite 1200 Anzeigepixel verwendet.

Wenn Sie möchten oder müssen, dass die Bitmap unabhängig von der Bildschirmauflösung mit genau der gleichen Anzahl von Pixel angezeigt wird, müssen Sie eine Transformation für das Bild festlegen, um den Effekt der Skalierung von WPF umzukehren würde sonst tun. Dies erfordert natürlich die Kenntnis der Bildschirmauflösung.


Hier sind einige weitere ähnliche Stack Overflow Fragen, die Ihnen nützlich sein könnten: RenderTargetBitmap renders image of a wrong size
WPF for LCD screen Full HD
Screen Resolution Problem In WPF?

3

Dies ist von Entwurf. Man beachte die MSDN documentation für BitmapSource.Width/Height:

Ruft die Breite des Bitmaps in geräteunabhängigen Einheiten (1/96th inch pro Einheit). (Überschreibungen ImageSource.Width.)

Stattdessen sollten Sie die PixelWidth/PixelHeight Eigenschaft:

Ruft die Breite des Bitmap in Pixeln.

Eine ziemlich verwirrend Wahl oder Begriffe, imo, aber es gehen Sie ..

Verwandte Themen