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

本文关键字:图像 图形 对象 绘制 保存 | 更新日期: 2023-09-27 18:33:58

我在"pictureBox2.Image.Save(st + "patch1.jpg")上抛出此代码异常;"我认为 pictureBox2.Image 上没有保存任何内容,但我在其上创建了图形 g。如何保存图片盒2.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");

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

几个问题。

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

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+ 异常。

Graphics g = pictureBox2.CreateGraphics();

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

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

反之亦然。为该位图创建目标位图和图形实例。然后将源图片框图像复制到该位图中。最后,将该位图分配给第二个图片框

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