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; }
修改说明
- 移除
File.Create流:Image.Save会自动创建并写入文件,提前创建流会导致文件锁定,引发写入失败 - 添加
using语句:确保GDI+的Image和缩略图对象使用后立即释放资源,避免文件锁定和内存泄漏 - 修正变量作用域:将
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
相关产品推荐
相关产品推荐

