WPF で画像がぼやけるのを防ぐ方法を探しています。アプリケーションを高 DPI ディスプレイで見栄えよくしたいので、アイコンを 96x96px で作成し、サイズ 32x32 で表示しました。
google には多くの情報があり、stackoverflow にもこれに関するトピックがいくつかあります。要約すると、プロパティUseLayoutRounding
を有効にしてに設定RenderOptions.BitmapScalingMode
しHighQuality
ます。残念ながら、これは私にはうまくいきません。画像はまだ非常にぼやけて見えます。次に、より高い DPI aaaand - WOW を備えたラップトップでアプリケーションをテストしました。画像は全体的にシャープでいいです。
私の唯一の解決策は、ImageSource を System.Drawing.Bitmap に変換するカスタム コントロールを作成し、そこでイメージの寸法に合わせて再スケーリングし、WPF ImageSource に変換することでした。明らかに完璧な解決策ではありません!
問題は、低 dpi ディスプレイで画像がぼやけて見えるのはなぜですか? 何が原因なのかわかりませんが、誰かがこれを修正するアイデアを持っていることを願っています.
私が見つけた最も有用なリソースのいくつかを次に示します。
- http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx
- http://www.nbdtech.com/Blog/archive/2008/11/20/blurred-images-in-wpf.aspx
- http://www.hanselman.com/blog/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWeirdOrAreBlurry.aspx
- WPF イメージでアンチエイリアシングを無効にする
編集:
ここで要求されているのは、ImageSource を変換するためのコードです。含まれていないメソッド呼び出しがいくつかありますが、Google を介して非常に高速に見つけることができます。
// Calculate the conversion factor.
float dpi = WpfImageHelper.GetCurrentDPI(this);
float factor = dpi / 96f;
int width = (int)Math.Round(this.image.ActualWidth * factor);
int height = (int)Math.Round(this.image.ActualHeight * factor);
// Create bitmaps.
Bitmap oldBitmap = WpfImageHelper.ToWinFormsBitmap2((BitmapSource)this.Source);
Bitmap newBitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
// Draw the new bitmap. Use high-quality interpolation mode.
using (Graphics g = Graphics.FromImage(newBitmap))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.Clear(System.Drawing.Color.Transparent);
g.DrawImage(oldBitmap, 0, 0, newBitmap.Width, newBitmap.Height);
}
// Set the image source to the resized bitmap.
this.Source = WpfImageHelper.ToWpfBitmap2(newBitmap);