これは以下のコードで生成されたBitmapです。
1 2 3 4 5 |
Bitmap bitmap = new Bitmap(20, 20); Graphics g = Graphics.FromImage(bitmap); g.Clear(Color.White); g.DrawRectangle(new Pen(Color.Black), new Rectangle(3, 3, 6, 6)); g.Dispose(); |
これは以下のコードで生成されたBitmapです。
1 2 3 4 5 |
Bitmap bitmap = new Bitmap(20, 20); Graphics g = Graphics.FromImage(bitmap); g.Clear(Color.White); g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(3, 3, 6, 6)); g.Dispose(); |
幅と高さが1ピクセル違っています。原因は線の太さです。Graphics.FillRectangleであれば線は関係ないのでそのままの大きさで描画されますが、Graphics.DrawRectangleの場合は線の幅が最低1ピクセルあるのでそのぶんずれてしまいます。このズレは線を太くすることでわかりやすくなります。
太さを3ピクセルにすると6ピクセルのはずの矩形の幅が9ピクセルになってしまいます。
1 2 3 4 5 |
Bitmap bitmap = new Bitmap(20, 20); Graphics g = Graphics.FromImage(bitmap); g.Clear(Color.White); g.DrawRectangle(new Pen(Color.Black, 3), new Rectangle(3, 3, 6, 6)); g.Dispose(); |
境界部分もふくめて指定した幅、高さの矩形を描画するにはどうすればいいのでしょうか?
以下のコードであれば線の太さを変えても幅と高さは変わりません。幅と高さが線の太さの2倍以下であれば内部は塗りつぶされます。
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 |
int penWidth = 1; Bitmap bitmap = new Bitmap(20, 20); Graphics g = Graphics.FromImage(bitmap); g.Clear(Color.White); DrawRectangle(g, Color.Black, penWidth, new Rectangle(3, 3, 6, 6)); g.Dispose(); void DrawRectangle(Graphics g, Color color, int penWidth, Rectangle rect) { if (penWidth * 2 >= rect.Width) { g.FillRectangle( new SolidBrush(color), new Rectangle(rect.X, rect.Y, rect.Width,rect.Height) ); } else { g.DrawRectangle( new Pen(color, penWidth), new Rectangle(rect.X + penWidth / 2, rect.Y + penWidth / 2, rect.Width - penWidth, rect.Height - penWidth) ); } } |