有些时候pictureBox中的图片需要根据不同的条件来动态加载,可能加载完成之后还需要使用Graphics对象在图片上面动态绘制文字,线条之类的,绘制完成之后我们又需要把pictureBox中展示的内容保存成一张图片,在其他地方使用,若使用方式不对,我们输出的图片始终是原来的图片,并不是我们修改之后的图片。
1、使用PictureBox.CreateGraphics()
PictureBox.CreateGraphics()是使用控件本身来获取画布,由控件获取的画布就是控件自己的画布,是画不到其他地方的。而且此时graphics是在picturebox控件上画图,不是在picturebox控件所在的图片上画图(相当于此时是在电脑屏幕上临时绘制,只要控件触发重绘机制,graphics所绘制的内容就会消失)
Graphics g = pictureBox1.CreateGraphics();Pen pen = new Pen(new SolidBrush(Color.Red), 2);Point p1 = new Point(2, 18);Point p2 = new Point(18, 0);g.DrawLine(pen, p1, p2);pictureBox3.Image = pictureBox1.Image;

使用PictureBox.CreateGraphics()
我们看到我们绘制的红线在picturebox1控件中显示了,但是picturebox3控件得到的还是picturebox1的原图,我们将界面拖拽至桌面外之后,picturebox1上红线也消失了。
2、使用Graphics.FromImage()
Graphics.FromImage()是根据已存在的图像来创建画布,创建之后可以更改已存在的图像,首先将已存在的画布载入成Image对象,然后使用Graphics.FromImage()来创建画布
Bitmap bmp = new Bitmap(pictureBox1.Image);Graphics g = Graphics.FromImage((Image)bmp);//绘制一条红色的斜线Pen pen = new Pen(new SolidBrush(Color.Red), 2);Point p1 = new Point(2, 18);Point p2 = new Point(18, 0);g.DrawLine(pen, p1, p2);//将修改的图片显示在pictureBox2pictureBox2.Image = bmp;

使用Graphics.FromImage()
我们看到我们绘制的红线在picturebox1控件中
没有显示
(因为我们是以picturebox1的画布为原型重新实例化了一个bitmap对象,然后以这个bitmap对象来创建的画布),但是picturebox2控件显示的是我们重绘之后的图片,我们将界面拖拽至桌面外之后,picturebox2上红线仍然存在。若再调用bmp.Save(“d:FromImage.png”),我们得到的就是重绘之后的图片。

重绘之后的图片