您的位置:首页 > 其它

修改图片,保存并替换原图片时,“GDI+ 中发生一般性错误”

2013-04-20 15:07 846 查看
在使用System.Drawing.Image.Save 方法保存图片时会出现,“GDI+ 中发生一般性错误”。

(猜测)这是因为加载的原图片资源没有得到释放,那么在Save新图片时,会强制将原图片删除,但此时原图片还在被使用,所有发生错误。想到的解决办法1:复制一份,将原图片dispose()。使用图片的Clone()方法,但是没有达到希望的效果,依然不行。办法2:使用Graphic对象绘制了一份,然后将原来的图片释放。该方法可行。

注:使用using语句简化资源释放的过程,并且能够保证资源的恰当释放。





private void openBtn_Click(object sender, EventArgs e)
{
using (mainOpenFileDialog)
{
// 打开对话框设置
mainOpenFileDialog.Filter = "所有文件(*.*)|*.*|(*.jpg)|*.jpg|(*.png)|*.png|(*.ico)|*.ico";
mainOpenFileDialog.FilterIndex = 2;
mainOpenFileDialog.InitialDirectory = Application.StartupPath;

if (mainOpenFileDialog.ShowDialog() == DialogResult.OK)
{
imageUrl = mainOpenFileDialog.FileName;

// 从本地读取图片,并释放资源
using (Bitmap tempImage = Bitmap.FromFile(imageUrl) as Bitmap)
{
// 创建本地图片的一个副本,由image引用,这样读取到的图片资源就可以释放,接下来操作的就是刚刚创建的副本
image = new Bitmap(tempImage.Width, tempImage.Height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(image))
{
g.DrawImage(tempImage, 0, 0);
}
}

mainPicBox.Image = image;
mainPicBox.BorderStyle = BorderStyle.Fixed3D;
mainPicBox.SizeMode = PictureBoxSizeMode.Zoom;
}
}
}

private void modifyBtn_Click(object sender, EventArgs e)
{
ImageOperation.GetPixel_Example(image);
this.mainPicBox.Invalidate();
}

private void saveBtn_Click(object sender, EventArgs e)
{
try
{
image.Save(imageUrl, ImageFormat.Jpeg);
MessageBox.Show("保存成功");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

public class ImageOperation
{
public static void GetPixel_Example(Bitmap bitmap)
{
for (int i = 0; i < bitmap.Width; i += 2)
for (int j = 0; j < bitmap.Height; j += 2)
bitmap.SetPixel(i, j, Color.Black);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: