我有这个代码在“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");
答案 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");