においてInterpolationModeとSmoothingModeの比較をしてみましたが、Graphics.DrawImageメソッドを使った場合はSmoothingModeは関係ないように思えます。実際にSmoothingModeを変更して保存したファイルを比較してみましたが、ファイルの内容は同一です。
SmoothingModeは直線の描画をするときに効果を発揮します。では直線ではなく円や文字の描画をするときはどうなのでしょうか? 今回はSmoothingModeをさまざまに設定して出力される画像を拡大して比較してみます。拡大率は10倍とし、補間モードはNearestNeighborを採用します。
まずは補間モードはNearestNeighborでサイズを8倍に拡大するメソッドを示します。スムージング処理が行なわれていないのであれば斜めに直線を引けばギザギザの直線が描画されるはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class Form1 : Form { // 補間モードはNearestNeighborでサイズを8倍に拡大する Bitmap ExpandBitmap8(Bitmap bitmap) { if (bitmap == null) return null; int newWidth = bitmap.Width * 8; int newHeight = bitmap.Height * 8; Bitmap newBitmap = new Bitmap(newWidth, newHeight); Graphics g = Graphics.FromImage(newBitmap); g.InterpolationMode = InterpolationMode.NearestNeighbor; g.DrawImage(bitmap, new Rectangle(0, 0, newWidth, newHeight)); g.Dispose(); return newBitmap; } } |
以下のコードを実験してみると以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); AllowDrop = true; } protected override void OnPaint(PaintEventArgs e) { Bitmap bitmap = CreateBitmapDraw(); bitmap = ExpandBitmap10(bitmap); e.Graphics.DrawImage(bitmap, new Point(0, 0)); base.OnPaint(e); } Bitmap CreateBitmapDraw() { Bitmap bitmap = new Bitmap(50, 70); Graphics g = Graphics.FromImage(bitmap); if (radioButtonNone.Checked) g.SmoothingMode = SmoothingMode.None; if (radioButtonDefault2.Checked) g.SmoothingMode = SmoothingMode.Default; if (radioButtonHighSpeed.Checked) g.SmoothingMode = SmoothingMode.HighSpeed; if (radioButtonHighQuality.Checked) g.SmoothingMode = SmoothingMode.HighQuality; if (radioButtonAntiAlias.Checked) g.SmoothingMode = SmoothingMode.AntiAlias; g.DrawLine(new Pen(Color.Black), new Point(5, 5), new Point(50, 50)); Point[] points = new Point[] { new Point(50, 5), new Point(10, 20), new Point(50, 40) }; g.DrawLines(new Pen(Color.Red), points); g.DrawEllipse(new Pen(Color.Green), new Rectangle(5, 5, 30, 30)); g.DrawRectangle(new Pen(Color.Pink), new Rectangle(5, 40, 20, 10)); g.Dispose(); return bitmap; } } |
<実行結果>
次に内部を塗りつぶすメソッドでも試してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public partial class Form1 : Form { protected override void OnPaint(PaintEventArgs e) { Bitmap bitmap = CreateBitmapFill(); bitmap = ExpandBitmap8(bitmap); e.Graphics.DrawImage(bitmap, new Point(0, 0)); base.OnPaint(e); } Bitmap CreateBitmapFill() { Bitmap bitmap = new Bitmap(50, 70); Graphics g = Graphics.FromImage(bitmap); if (radioButtonNone.Checked) g.SmoothingMode = SmoothingMode.None; if (radioButtonDefault2.Checked) g.SmoothingMode = SmoothingMode.Default; if (radioButtonHighSpeed.Checked) g.SmoothingMode = SmoothingMode.HighSpeed; if (radioButtonHighQuality.Checked) g.SmoothingMode = SmoothingMode.HighQuality; if (radioButtonAntiAlias.Checked) g.SmoothingMode = SmoothingMode.AntiAlias; g.FillEllipse(new SolidBrush(Color.Green), new Rectangle(5, 5, 30, 30)); g.FillRectangle(new SolidBrush(Color.Pink), new Rectangle(5, 40, 20, 10)); Point[] points = new Point[] { new Point(30, 40), new Point(50, 45), new Point(35, 55), }; g.FillPolygon(new SolidBrush(Color.Red), points); g.Dispose(); return bitmap; } } |
実行結果は以下のようになります。
<実行結果>
ではGraphic.DrawStringメソッドを呼び出すときはどうなるのでしょうか? 実行結果はかわりません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public partial class Form1 : Form { protected override void OnPaint(PaintEventArgs e) { Bitmap bitmap = CreateBitmapString(); bitmap = ExpandBitmap8(bitmap); e.Graphics.DrawImage(bitmap, new Point(0, 0)); base.OnPaint(e); } Bitmap CreateBitmapString() { Bitmap bitmap = new Bitmap(50, 70); Graphics g = Graphics.FromImage(bitmap); if (radioButtonNone.Checked) g.SmoothingMode = SmoothingMode.None; if (radioButtonDefault2.Checked) g.SmoothingMode = SmoothingMode.Default; if (radioButtonHighSpeed.Checked) g.SmoothingMode = SmoothingMode.HighSpeed; if (radioButtonHighQuality.Checked) g.SmoothingMode = SmoothingMode.HighQuality; if (radioButtonAntiAlias.Checked) g.SmoothingMode = SmoothingMode.AntiAlias; g.DrawString("あい", new Font("MS ゴシック", 12), new SolidBrush(Color.Blue), new Point(5, 5)); return bitmap; } } |
<実行結果>
>アンチエイリアス処理をして描画する – .NET Tips (VB.NET,C#…)によると、文字列の描画におけるアンチエイリアス処理は、Graphics.TextRenderingHintプロパティで指定しなければならないそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public partial class Form1 : Form { protected override void OnPaint(PaintEventArgs e) { Bitmap bitmap = CreateBitmapString2(); bitmap = ExpandBitmap8(bitmap); e.Graphics.DrawImage(bitmap, new Point(0, 0)); base.OnPaint(e); } Bitmap CreateBitmapString2() { Bitmap bitmap = new Bitmap(50, 70); Graphics g = Graphics.FromImage(bitmap); if (radioButtonSystemDefault.Checked) g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault; if (radioButtonAntiAlias1.Checked) g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; if (radioButtonAntiAliasGridFit.Checked) g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; if (radioButtonClearTypeGridFit.Checked) g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; if (radioButtonSingleBitPerPixel.Checked) g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel; if (radioButtonSingleBitPerPixelGridFit.Checked) g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; g.DrawString("あい", new Font("MS ゴシック", 12), new SolidBrush(Color.Blue), new Point(5, 5)); return bitmap; } } |
<実行結果>
ではこれをGraphics.DrawImageメソッドを呼び出すときに設定するとどうなるでしょうか?
どれを選択しても下図と同じで変化はまったくみられませんでした。