从图片框保存图像,图像由图形对象绘制

时间:2013-10-03 15:52:09

标签: c# graphics bitmap picturebox

我有这个代码在“pictureBox2.Image.Save(st +”patch1.jpg“)上抛出异常;”我认为pictureBox2.Image上没有任何东西保存,但我已经创建了图形g。 如何保存pictureBox2.Image的图像?

        Bitmap sourceBitmap = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
        Graphics g = pictureBox2.CreateGraphics();
        g.DrawImage(sourceBitmap, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height),rectCropArea, GraphicsUnit.Pixel);
        sourceBitmap.Dispose();
        g.Dispose();
        path = Directory.GetCurrentDirectory();
        //MessageBox.Show(path);
        string st = path + "/Debug";
        MessageBox.Show(st);
        pictureBox2.Image.Save(st + "patch1.jpg");

3 个答案:

答案 0 :(得分:2)

有几个问题。

首先,CreateGraphics是一个临时绘图表面,不适合保存任何东西。我怀疑你想要实际创建一个新图像并在第二个PictureBox中显示它:

Bitmap newBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(newBitmap)) {
  g.DrawImage(pictureBox1.Image, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height), rectCropArea, GraphicsUnit.Pixel);
}
pictureBox2.Image = newBitmap;

其次,使用Path.Combine函数创建文件字符串:

string file = Path.Combine(new string[] { Directory.GetCurrentDirectory(), "Debug", "patch1.jpg" });
newBitmap.Save(file, ImageFormat.Jpeg);

该路径必须存在,否则Save方法将抛出GDI +异常。

答案 1 :(得分:1)

Graphics g = pictureBox2.CreateGraphics();

您应该阅读有关此方法的文档,它根本不是您想要的。它是用于绘制OnPaint之外的控件,这是一种不好的做法,并且会被下一个OnPaint覆盖,并且它与PictureBox.Image属性无关,绝对没有。

你到底想要做什么?您想要保存PictureBox控件中显示的图像裁剪吗?在将其保存到磁盘之前,是否需要预览裁剪操作?裁剪矩形更改时是否需要更新此预览?提供更多细节。

答案 2 :(得分:1)

反过来做。为该位图创建目标位图和Graphics实例。然后将源图片框图像复制到该位图。最后,将该位图分配给第二个图片框

Rectangle rectCropArea = new Rectangle(0, 0, 100, 100);
Bitmap destBitmap = new Bitmap(pictureBox2.Width, pictureBox2.Height);
Graphics g = Graphics.FromImage(destBitmap);
g.DrawImage(pictureBox1.Image, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height), rectCropArea, GraphicsUnit.Pixel);
g.Dispose();
pictureBox2.Image = destBitmap;
pictureBox2.Image.Save(@"c:\temp\patch1.jpg");