C# アンチエイリアシングしないPicturebox
画像がぼやける
下の画像みたいに,10x10画素の画像を拡大してPictureBoxコントロールに標示させたい.
そのまま表示させようとすると,以下みたいにアンチエイリアシングされてぼやけてしまう.
「画像を縮小するとピクセルにグラデーション?がかかる」にあるように一度Graphicsを作成してからInterpolationModeとPixelOffsetModeを指定すればアンチエイリアシングしないで表示はできる.
が,わざわざGraphicsを作成するというのも面倒なので,そうしなくてもアンチエイリアシング処理しないPictureBoxコントロールを作る.
InterpolationModeを指定可能なPictureBox
Graphicsで画像の拡大・回転時の画素の補間方法はInterpolationModeで指定可能だが,これをPictureBoxでも指定できるようにする.
以下のように,PictureBoxを継承したコントロールを作ってやる.InterpolationModeプロパティをNearestNeighborに指定すれば,アンチエイリアシングなしで画像が表示される.
using System; using System.Windows.Forms; using System.Drawing.Drawing2D; using System.ComponentModel; namespace Whoopsidaisies { class InterpolatedPictureBox : PictureBox { private InterpolationMode interpolation = InterpolationMode.Default; [DefaultValue(typeof(InterpolationMode), "NearestNeighbor"), Description("The interpolation used to render the image.")] public InterpolationMode Interpolation { get { return interpolation; } set { if (value == InterpolationMode.Invalid) throw new ArgumentException("\"Invalid\" is not a valid value."); // (Duh!) interpolation = value; Invalidate(); // Image should be redrawn when a different interpolation is selected } } protected override void OnPaint(PaintEventArgs pe) { pe.Graphics.InterpolationMode = interpolation; pe.Graphics.PixelOffsetMode = PixelOffsetMode.Half; base.OnPaint(pe); } } }