WPF – BitmapImage falsche Höhe, Breite und unscharfe Darstellung

Veröffentlicht von

Bilder werden unscharf in der WPF-GUI dargestellt nach dem Laden? Width und Height passen bei genauer Betrachtung auch nicht?

Bei der Umstellung meiner Software von Winforms auf WPF habe ich beim Laden von Bildern von der Festplatte unschöne Effekte festgestellt. Je nach Bild wurden diese seltsam dargestellt.

Das Bild habe ich direkt von der Festplatte geladen und in einem Image angezeigt:

var imageSource = new BitmapImage(new Uri(imgFileName));
pictureTemplate.Source = imageSource;

Wie man sieht ist das Bild unscharf und die Größenverhältnisse passen nicht. Ein Tipp auf Stackoverflow brachte den entscheidenen Hinweis. Die DPI sind entscheidend.

WPF möchte anscheinend 96dpi Bilder haben, meine hatten teilweise nur 72dpi

Gibt man z.B. die Höhe und Breite im Output aus, werden auch die falschen Werte für Width und Height angezeigt:

System.Diagnostics.Debug.WriteLine(imageSource.Height + ";" +  imageSource.Width + " ; " + imgFileName);

Gut nicht immer, bei einigen Bildern passte alles, diese hatten dann aber auch die richtigen 96 dpi.

Die Lösung

Nun gibt es zwei Möglichkeiten. Die Erste ist die Bilder anzupacken und mit 96dpi abzuspeichern. Nun wollte ich nicht alle Bilder anfassen und habe daher die folgende Funktion von Stackoverflow verwendet:

 public static BitmapSource ConvertBitmapTo96DPI(BitmapImage bitmapImage)
{
    double dpi = 96;
    int width = bitmapImage.PixelWidth;
    int height = bitmapImage.PixelHeight;

    int stride = width * bitmapImage.Format.BitsPerPixel;
    byte[] pixelData = new byte[stride * height];
    bitmapImage.CopyPixels(pixelData, stride, 0);

    return BitmapSource.Create(width, height, dpi, dpi, bitmapImage.Format, null, pixelData, stride);
}

Mit dieser kann ich nun die Bilder vor dem Anzeigen noch zu 96dpi konvertieren:

pictureTemplate.Source = UiFunctions.ConvertBitmapTo96DPI(imageSource);

Das Ergebnis passte anschließend:

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.