2009-07-01 14 views
2

Quand je lance le code suivant:C#, GDI + - Pourquoi mes rectangles sont-ils tronqués?

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); 
     } 
    } 

Je reçois le texte suivant:

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

Notes:

  • Il arrive que lorsque je tourne une image, puis dessiner un rectangle qui dépasse les dimensions originales de l'image.

  • Le rectangle n'est pas tronqué à la largeur de l'image d'origine - seul le bord droit du rectangle n'est pas dessiné.

  • Cela se produit dans une variété de scénarios. Je l'ai d'abord remarqué dans une application beaucoup plus compliquée - je viens d'écrire cette application pour en faire une illustration simple du problème.

Quelqu'un peut-il voir ce que je fais mal?

Répondre

7

Cela semble être un bug GDI + Microsoft a été au courant depuis au moins 2005 (http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=96328). J'ai été capable de reproduire le problème que vous décrivez. Une solution possible consisterait à créer une deuxième bitmap à partir de la première, et à en tirer parti. Le code suivant semble dessiner correctement:

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

Génial - merci beaucoup !!! – mbeckish

0

Votre problème est DrawRectangle. L'emplacement de départ de votre rectangle atteint la fin de votre bitmap initial.

Si vous modifiez l'emplacement de votre rectangle, vous pourrez le voir complètement.

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

Je ne peux pas changer l'emplacement du rectangle - Je veux dessiner là. Si vous basculez un point d'arrêt, vous pouvez voir que le bitmap et le graphique g2 obtiennent les nouvelles dimensions avant que le rectangle soit dessiné. – mbeckish

0

J'ai essayé votre code avec TryGdiPlus (très utile pour ce genre de choses, d'ailleurs). Je réussi à faire le tirage au sort rectangle sans coupure avec une largeur de 99 pixels:

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

Il semble que toujours 300 pixels de largeur du bitmap, même après la rotation.

+0

Si vous basculez un point d'arrêt, vous pouvez voir que le bitmap et le graphique g2 obtiennent les nouvelles dimensions avant que le rectangle soit dessiné. – mbeckish