
これは以下のコードで生成された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)         );     } } | 
