「WPF」BitmapSourceのdpiを変更する。

C# コンピュータ
C#
WPFで画像ファイルを読み込んで表示させる際、画像が変形して表示されることがありました。
原因は調べていませんが画像のdpiを固定してあげると解決するようなのでdpiを変換するメソッドを作成してみます。
    public static System.Windows.Media.Imaging.BitmapSource
    ConvertToDPI96(System.Windows.Media.Imaging.BitmapSource src)
    {
        const double dpi = 96;

        if (src.DpiX == dpi && src.DpiY == dpi) return src;
        
        int width = src.PixelWidth;
        int height = src.PixelHeight;
        int stride = (width * src.Format.BitsPerPixel + 7) / 8;
        byte[] pixelData = new byte[stride * height];
        src.CopyPixels(pixelData, stride, 0);

        var dest = System.Windows.Media.Imaging.BitmapImage.Create(
            width,
            height,
            dpi,
            dpi,
            System.Windows.Media.PixelFormats.Bgra32,
            null,
            pixelData,
            stride);
        dest.Freeze();

        return dest;
    }
dpiを変更するメソッドConvertToDPI96()の引数のBitmapSourceのPixelFormatはPixelFormats.Bgra32を想定しています。
試してみたところ以下のような結果になりました。
変換前画像:72.00900268554688dpi
変換後画像:96dpi

コメント