C#,GDI+;-为什么我的矩形会被截断?

C#,GDI+;-为什么我的矩形会被截断?,c#,gdi+,rotation,drawrectangle,C#,Gdi+,Rotation,Drawrectangle,当我运行以下代码时: 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)

当我运行以下代码时:

    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);
        }
    }
我得到以下信息:

注:

  • 只有当我旋转一个图像,然后画一个超出图像原始尺寸的矩形时,才会发生这种情况

  • 矩形不会截断为原始图像宽度-只会绘制矩形的右边缘

  • 这种情况在各种情况下都会发生。我第一次注意到它是在一个更复杂的应用程序中——我写这个应用程序只是为了简单地说明这个问题


有人知道我做错了什么吗?

你的问题出在我身上。矩形的起始位置到达初始位图的末尾

如果更改矩形的位置,您将能够完全看到它

using (Graphics g2 = Graphics.FromImage(b))
{
    g2.DrawRectangle(new Pen(Color.White, 7.2f), 50, 50, 150, 100);
}
我试过你的代码(顺便说一句,对这类事情非常有用)。 我成功地绘制了宽度为99像素的矩形,无需剪裁:

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

因此,即使在旋转后,位图的宽度看起来仍然是300像素。

这似乎是微软至少从2005年就意识到的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);
    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);
    }
}

我无法更改矩形的位置-我想在那里绘制它。如果切换断点,可以看到位图和图形g2在绘制矩形之前都获得了新的尺寸。如果切换断点,可以看到位图和图形g2在绘制矩形之前都获得了新的尺寸。