C#
.NET
WPF
WPF,C#

WPF Imageコントロールの拡大・縮小アルゴリズム変更方法

More than 3 years have passed since last update.

WPFのImageコントロールを用いて画像を表示するアプリケーションを開発していたのですが、画像を拡大・縮小した際に、Frameworkのバージョンを3.5から4.0以降にあげたると画質が劣化するという問題が発生しました。

色々調べてみると、以下のことが分かりました。
1.拡大縮小のアルゴリズムはImageコントロールのVisualBitmapScalingModeプロパティで決定される
2.VisualBitmapScalingModeの値は、デフォルトでBitmapScalingMode列挙体のUnspecifiedが設定されている
3.BitmapScalingMode列挙体のUnspecifiedの値は.NET 3.5以前はFantと同等だが、4.0以降はLinear同等となる

以下はMSDNの関連情報です。
.NET Framework 3.5
https://msdn.microsoft.com/ja-jp/library/system.windows.media.bitmapscalingmode(v=vs.90).aspx
.NET Framework 4.0
https://msdn.microsoft.com/ja-jp/library/system.windows.media.bitmapscalingmode(v=vs.100).aspx

で、問題はVisualBitmapScalingModeプロパティのアクセシビリティがprotected internalな事です。
この為、普通に変更することができないため、以下のようにImageを継承したクラスを作成することで対応しました。

    public class FantScalingImage : System.Windows.Controls.Image
    {
        protected override void OnRender(System.Windows.Media.DrawingContext dc)
        {
            this.VisualBitmapScalingMode = System.Windows.Media.BitmapScalingMode.Fant;
            base.OnRender(dc);
        }
    }