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

C#根据图片路径生成缩略图时抛出‘GDI+发生一般性错误’

解决GDI+通用错误:生成缩略图保存失败问题

你遇到的'A generic error occurred in GDI+.'错误核心原因有两个:

  • 提前用File.Create(filePath)创建的文件流未释放,导致文件被锁定,后续thumb.Save(filePath)无法写入
  • Image.FromFile打开的原始图片未被正确释放,引发文件占用问题

修正后的代码

public static string UploadThumbnailImage(string existingImagePath)
{
    var fileName = "thumb_" + Guid.NewGuid().ToString() + ".jpg";
    var filePath = Path.Combine("Uploads/Images", fileName);
    var originalFilePath = Path.GetFullPath(existingImagePath);

    // using包裹Image对象,确保文件资源及时释放
    using (var image = Image.FromFile(originalFilePath))
    {
        using (var thumb = image.GetThumbnailImage(150, 150, () => false, IntPtr.Zero))
        {
            // 直接保存到文件,无需提前创建流
            thumb.Save(filePath);
        }
    }

    string thumbnailImageUrl = string.Format("/{0}/{1}", "Uploads/Images", fileName);
    return thumbnailImageUrl;
}

修改说明

  1. 移除File.Create流:Image.Save会自动创建并写入文件,提前创建流会导致文件锁定,引发写入失败
  2. 添加using语句:确保GDI+的Image和缩略图对象使用后立即释放资源,避免文件锁定和内存泄漏
  3. 修正变量作用域:将originalFilePath改为局部变量,避免全局状态污染

更稳定的缩略图生成方案(可选)

如果GetThumbnailImage对部分特殊格式图片支持不佳,可改用手动绘制的方式,兼容性更好:

public static string UploadThumbnailImage(string existingImagePath)
{
    var fileName = "thumb_" + Guid.NewGuid().ToString() + ".jpg";
    var filePath = Path.Combine("Uploads/Images", fileName);
    var originalFilePath = Path.GetFullPath(existingImagePath);

    using (var originalImage = Image.FromFile(originalFilePath))
    {
        // 创建指定尺寸的缩略图画布
        using (var thumbnailImage = new Bitmap(150, 150))
        {
            using (var graphics = Graphics.FromImage(thumbnailImage))
            {
                // 设置高质量缩放参数
                graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                
                // 绘制缩放后的图片
                graphics.DrawImage(originalImage, 0, 0, 150, 150);
            }
            thumbnailImage.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
    }

    string thumbnailImageUrl = string.Format("/{0}/{1}", "Uploads/Images", fileName);
    return thumbnailImageUrl;
}

内容的提问来源于stack exchange,提问作者Roxy'Pro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:00:53