从图片框中保存图像,图像是由图形对象绘制的
本文关键字:图像 图形 对象 绘制 保存 | 更新日期: 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");