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

我得到以下信息:

替代文字 http://www.freeimagehosting.net/uploads/2c309ec21c.png

笔记:

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

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

  • 这发生在各种场景中。我首先在一个更复杂的应用程序中注意到它——我只是写了这个应用程序来简单说明这个问题。

谁能看到我做错了什么?

4

3 回答 3

7

这似乎是微软至少从 2005 年开始就意识到的 GDI+ 错误(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);
    }
}

替代文字 http://www.freeimagehosting.net/uploads/f6ae684547.png

于 2009-07-01T18:18:10.870 回答
0

你的问题是 DrawRectangle。矩形的起始位置到达初始位图的末尾。

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

using (Graphics g2 = Graphics.FromImage(b))
{
    g2.DrawRectangle(new Pen(Color.White, 7.2f), 50, 50, 150, 100);
}
于 2009-07-01T18:05:20.237 回答
0

我用TryGdiPlus尝试了你的代码(顺便说一句,对这类事情非常有用)。我设法使矩形绘制而不裁剪宽度为 99 像素:

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

所以看起来即使旋转后位图的宽度仍然是 300 像素。

于 2009-07-01T18:07:26.957 回答