C #, GDI + - Почему мои прямоугольники усекаются?

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

        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

Примечания:

  • Это происходит только тогда, когда я поворачиваю изображение, а затем рисую прямоугольник, который проходит за исходные размеры изображения.

  • Прямоугольник не усекается до первоначальной ширины изображения - только правый край прямоугольника не нарисован.

  • Это происходит во множестве сценариев. Я впервые заметил это в гораздо более сложном приложении - я просто написал это приложение, чтобы сделать простую иллюстрацию проблемы.

Может ли кто-нибудь увидеть, что я делаю неправильно?

Теги:
rotation
gdi+
drawrectangle

3 ответа

7
Лучший ответ

Кажется, это ошибка GDI +, о которой Microsoft знала с 2005 года (http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=96328). Я смог воспроизвести описанную вами проблему. Одним из возможных решений могло бы стать создание второго растрового изображения с первого и сделать это. Следующий код выглядит правильно:

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
    Круто - спасибо большое !!!
0

Ваша проблема - DrawRectangle. Начальное расположение вашего прямоугольника достигает конца вашего исходного растрового изображения.

Если вы измените местоположение своего прямоугольника, вы сможете увидеть его полностью.

using (Graphics g2 = Graphics.FromImage(b))
{
    g2.DrawRectangle(new Pen(Color.White, 7.2f), 50, 50, 150, 100);
}
  • 0
    Я не могу изменить местоположение прямоугольника - я хочу нарисовать его там. Если вы переключите точку останова, вы увидите, что как растровое изображение, так и графика g2 получают новые измерения до того, как будет нарисован прямоугольник.
0

Я пробовал свой код с TryGdiPlus (очень полезно для таких вещей, BTW). Мне удалось сделать рисование прямоугольника без обрезки с шириной 99 пикселей:

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

Итак, похоже, что ширина растрового изображения еще 300 пикселей даже после поворота.

  • 0
    Если вы переключите точку останова, вы увидите, что как растровое изображение, так и графика g2 получают новые измерения до того, как будет нарисован прямоугольник.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню