1

我正在尝试将图像绘制到图片框 ( pbImage) 并在之后将其转换为位图,但它崩溃了,因为pcImage.Image很明显null,我可以在它崩溃之前看到绘图,所以我不明白它是怎么回事null

这是错误:

System.Drawing.dll 中发生“System.NullReferenceException”类型的未处理异常附加信息:对象引用未设置为对象的实例。

bool[,] bCollision = new bool[pbImage.Width,pbImage.Height];
Color cPixelCol;
Graphics G = Graphics.FromHwnd(pbImage.Handle);
Pen SquarePen = new Pen(Color.Black, 5);
SquarePen = new Pen(Color.Red, 5);
Brush BackBrush = new SolidBrush(Color.Aqua);
G.FillRectangle(BackBrush, 50, 50, this.Width, this.Height);
G.DrawLine(SquarePen, 410, 50, 410, 400);
G.DrawEllipse(SquarePen, 50 + x, 50, 100+x, 50);
Bitmap bm = new Bitmap(pbImage.Image);   <------------- this line crashes
4

2 回答 2

5

“我可以在它崩溃之前看到它,所以我不明白它是如何为空的。”

是的,因为您使用以下方法将图像绘制到屏幕上:

Graphics G = Graphics.FromHwnd(pbImage.Handle);

这只是在 PictureBox 的“顶部”绘制到临时图形。如果您通过另一个窗口,以这种方式绘制的任何内容都将被删除。没有实际分配给 PictureBox 的 Image() 属性。

为什么不从创建位图开始,然后从中获取图形?之后,您可以将该位图分配给您的 PictureBox:

        Bitmap bmp = new Bitmap(pbImage.Width, pbImage.Height); // not sure what widht/height you really need
        using (Graphics G = Graphics.FromImage(bmp))
        {
            using (Pen SquarePen = new Pen(Color.Red, 5))
            {
                G.Clear(Color.Aqua);
                G.DrawLine(SquarePen, 410, 50, 410, 400);
                G.DrawEllipse(SquarePen, 50 + x, 50, 100 + x, 50);
            }
        }
        pbImage.Image = bmp;
于 2013-06-04T19:00:12.807 回答
0

我不确定,但我认为您需要在使用 Image 之前释放 Graphics 对象。试试这个...

G.DrawEllipse(SquarePen, 50 + x, 50, 100+x, 50);
G.Dispose();
Bitmap bm = new Bitmap(pbImage.Image);
于 2013-06-04T16:04:08.363 回答