本地编辑添加水印的图片保存时出现GDI+通用错误异常该如何处理
问题根因
这个A generic error occurred in GDI+报错90%以上的场景都是文件被占用锁定导致的:
- 调用
Image.FromFile()加载源图片时,GDI+会一直持有该文件的锁,直到这个Image对象被显式释放 - 后续直接把修改后的Bitmap保存回同一个文件路径时,源文件还处于被锁定状态,写入操作被系统拒绝,就会抛出通用GDI+错误
修复方案
1. 调整图片加载逻辑,避免锁文件
改用文件流加载图片,加载完成后立即释放文件流,解除对源文件的锁定,后续保存到同路径就不会有冲突。
2. 补全所有非托管资源的释放逻辑
Bitmap、Brush、Image这些GDI+对象都属于非托管资源,需要用using语句确保操作完成后立即释放,避免资源泄漏导致的其他异常。
修复后代码示例
public static void Test() { try { string filepath = "Desktop/cropped/cropped/croppedsent1386.jpeg"; // 用文件流加载图片,加载完成后立即释放文件锁 using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read)) using (var originalImg = Image.FromStream(fs)) // 创建独立的Bitmap对象,和原始文件流/文件不再挂钩 using (var bmpPic = new Bitmap(originalImg)) { using (Graphics g = Graphics.FromImage(bmpPic)) using (Brush brush = new SolidBrush(Color.FromArgb(80, 255, 255, 255))) { Point postionWaterMark = new Point((bmpPic.Width / 6), (bmpPic.Height / 2)); g.DrawString("Identifid", new System.Drawing.Font("Arial", 30, FontStyle.Bold, GraphicsUnit.Pixel), brush, postionWaterMark); } // 此时原始文件已经没有锁,可以直接覆盖保存 bmpPic.Save(filepath, ImageFormat.Jpeg); } } catch(Exception ex) { Console.WriteLine(ex); } Console.WriteLine("End of test "); }
额外排查点
如果修改后还有报错,可以把文件路径换成绝对路径避免相对路径定位错误:
string basePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string filepath = Path.Combine(basePath, @"cropped\cropped\croppedsent1386.jpeg");
内容的提问来源于stack exchange,提问作者Johny Test
相关产品推荐
相关产品推荐

