2009-07-01 14 views
2

私は次のコードを実行すると:C#、GDI + - 四角形が切り詰められるのはなぜですか?

private void button1_Click(object sender, EventArgs e) 
    { 
     Bitmap b = new Bitmap(300, 400); 
     using (Graphics g = Graphics.FromImage(b)) 
     { 
      g.FillRectangle(Brushes.Black, new Rectangle(0, 0, 300, 400)); 
     } 

     b.RotateFlip(RotateFlipType.Rotate90FlipNone); 

     using (Graphics g2 = Graphics.FromImage(b)) 
     { 
      g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 150, 100); 
     } 

     using (Graphics g3 = this.panel1.CreateGraphics()) 
     { 
      g3.DrawImage(b, 0, 0); 
     } 
    } 

を、私は次を得る:

alt text http://www.freeimagehosting.net/uploads/2c309ec21c.png

注:

  • 唯一の私は、画像を回転させたときに、その後、描画起こりますイメージの寸法を超えて延びる長方形。

  • 矩形は元の画像の幅に切り詰められません。矩形の右端のみが描画されません。

  • これは、さまざまなシナリオで発生します。私ははるかに複雑なアプリでそれを最初に気づいた - 私は問題の簡単なイラストを作るためにこのアプリを書いた。

私が間違っていることは誰でも見ることができますか?

答えて

7

これは、少なくとも2005年(http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=96328)以降、Microsoftが認識しているGDI +バグのようです。あなたが描いている問題を再現することができました。考えられる解決策の1つは、最初のビットマップから2番目のビットマップを作成し、それを描画することです。次のコードは正しく描画されているようだ:

private void button1_Click(object sender, EventArgs e) { 
    Bitmap b = new Bitmap(300, 400); 
    using (Graphics g = Graphics.FromImage(b)) { 
     g.FillRectangle(Brushes.Black, new Rectangle(0, 0, 300, 400)); 
    } 

    b.RotateFlip(RotateFlipType.Rotate90FlipNone); 
    Bitmap b2 = new Bitmap(b); 

    using (Graphics g2 = Graphics.FromImage(b2)) { 
     g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 150, 100); 
    } 

    using (Graphics g3 = this.panel1.CreateGraphics()) { 
     g3.DrawImage(b2, 0, 0); 
    } 
} 

alt text http://www.freeimagehosting.net/uploads/f6ae684547.png

+0

恐ろしい - ありがとうございました! – mbeckish

0

問題はDrawRectangleです。あなたの矩形の開始位置は、最初のビットマップの終わりに達します。

矩形の位置を変更すると、矩形を完全に見ることができます。

using (Graphics g2 = Graphics.FromImage(b)) 
{ 
    g2.DrawRectangle(new Pen(Color.White, 7.2f), 50, 50, 150, 100); 
} 
+0

私は矩形の位置を変更することはできません - 私はそれを描きたいです。ブレークポイントを切り替えると、矩形が描画される前にBitmapとGraphics g2の両方が新しい寸法を取得することがわかります。 – mbeckish

0

私は(ところで、こんなもののために非常に有用)TryGdiPlusであなたのコードを試してみました。 は、私は99個のピクセルの幅でクリッピングすることなく、長方形の描画を行うために管理:

g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 99, 100); 

ビットマップの幅がさらに回転させた後、まだ300個のピクセルであるかのように見えます。

+0

ブレークポイントを切り替えると、矩形が描画される前にビットマップとグラフィックスg2の両方が新しい寸法を取得することがわかります。 – mbeckish

関連する問題