Domanda

Quando eseguo il seguente codice:

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

ottengo il seguente:

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

Note:

  • Succede solo quando ho ruotare un'immagine, quindi disegnare un rettangolo che si estende oltre il originale dimensioni dell'immagine.

  • Il rettangolo non viene troncato alla larghezza dell'immagine originale - solo il bordo destro del rettangolo non viene disegnato

  • .
  • Questo accade in una varietà di scenari. Ho notato che in un'applicazione molto più complicata - che ho appena scritto questa applicazione per fare una semplice illustrazione del problema

  • .

Qualcuno può vedere quello che sto facendo male?

È stato utile?

Soluzione

Questo sembra essere un bug GDI + di Microsoft è a conoscenza di almeno dal 2005 ( http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=96328 ). Sono stato in grado a Repro il problema che si descrive. Una possibile soluzione potrebbe essere quella di creare un secondo bitmap fuori il primo, e disegnare su quello. Il seguente codice sembra disegnare correttamente:

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

Altri suggerimenti

Il tuo problema è DrawRectangle. La posizione iniziale del rettangolo raggiunge la fine della vostra bitmap iniziale.

Se si modifica la posizione del rettangolo si sarà in grado di vedere tutto.

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

Ho provato il codice con TryGdiPlus (molto utile per questo genere di cose, BTW). Sono riuscito a fare il sorteggio rettangolo senza ritaglio con una larghezza di 99 pixel:

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

in modo che appaia come se la larghezza della bitmap è ancora 300 pixel, anche dopo la rotazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top