You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地编辑添加水印的图片保存时出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:24:02