Wpf

ImageSourceへの画像の読み込み-幅と高さが正しくありません



Loading Image Into Imagesource Incorrect Width



解決:

DPIを外部で変更したくない場合は、次の方法で変更できます。

public static BitmapSource ConvertBitmapTo96DPI(BitmapImagebitmapImage){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); BitmapSource.Create(width、height、dpi、dpi、bitmapImage.Format、null、pixelData、stride);を返します。 }

Image.Source.Width / Heightに正しい値が必要な場合は、次のようにすることができます。



this.myImage.Tag = new double [] {bitmapImage.DpiX、bitmapImage.DpiY}; this.myImage.Source =ビットマップイメージ;

次のようにサイズを変更します。

public static void ResizeImage(Image img、double maxWidth、double maxHeight){if(img == null || img.Source == null)return; double srcWidth = img.Source.Width; double srcHeight = img.Source.Height; //画像タグをソースのDPI値に設定して、スマートサイズ変更を行いますif DPI!= 96 if(img.Tag!= null && img.Tag.GetType()== typeof(double [])){double [] DPI = (double [])img.Tag; srcWidth = srcWidth /(96 / DPI [0]); srcHeight = srcHeight /(96 / DPI [1]); } double resizedWidth = srcWidth; double resizedHeight = srcHeight;二重アスペクト= srcWidth / srcHeight; if(resizedWidth> maxWidth){resizeedWidth = maxWidth;サイズ変更された高さ=サイズ変更された幅/アスペクト; } if(resizedHeight> maxHeight){アスペクト=サイズ変更された幅/サイズ変更された高さ;サイズ変更されたHeight = maxHeight;サイズ変更された幅=サイズ変更された高さ*アスペクト; } img.Width = resizedWidth; img.Height = resizedHeight; } 

画像の解像度を96DPIに設定する必要があります(現在、間違ったpngの場合は71.12です)。



無料のpaint.netプログラム(http://getpaint.net)を使用して、[画像]メニューから[キャンバスサイズ]を選択し、[解像度]フィールドを96に設定します。


これは、画像のDPIが原因です。 WPFは、デフォルトで96dpiをレンダリングします。間違ったpng画像のdpiを見ると。 72に設定されていることがわかります。これにより、WPFは画像を96 DPIに拡大縮小し、元のサイズを維持します。

2つの解決策があります。あなたはできる:



  1. XnViewなどを使用してDPIを変更します。 96に設定します。
  2. WidthプロパティとHeightプロパティを16に設定し、StretchプロパティをUniformに設定します