图像到字节数组失败“GDI+ 中发生一般错误。”
Posted
技术标签:
【中文标题】图像到字节数组失败“GDI+ 中发生一般错误。”【英文标题】:Image to byte array fails "A generic error occurred in GDI+." 【发布时间】:2021-09-07 12:18:20 【问题描述】:假设我让用户从计算机中选择图像。我将文件加载到图片框。这里是转换方法:
public static Image LoadImageFromFile(string fileName)
Image result = null;
if (!File.Exists(fileName))
return result;
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
try
using (Image image = Image.FromStream(fs))
ImageManipulation.RotateImageByExifOrientationData(image);
result =(Image) image.Clone();
image.Dispose();
finally
fs.Close();
return result;
然后,当用户单击“保存”按钮时,我将图像转换为字节数组并将其保存到数据库中。这是转换代码:
public static byte[] ImageToByteArray(Image image)
if (image == null)
return null;
using (var ms = new MemoryStream())
ImageFormat imageFormat = image.RawFormat;
ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.FormatID == imageFormat.Guid);
var encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
if (codec != null)
image.Save(ms, codec, encoderParameters);
else
image.Save(ms, ImageFormat.Jpeg);
return ms.ToArray();
但问题是: 我在磁盘上有一个 jpg 文件。我可以毫无问题地将它加载到我的图片框中。图片在其中完全可见。但是当我保存它时,代码给了我“GDI+ 中发生了一般错误”。 'image.Save(ms, codec,encoderParameters)' 行出错。
更奇怪的事件:我不会一直收到这个错误。它发生在特定的图像上。例如,我从互联网上下载了一张图片并在“Paint”中裁剪并保存为 jpg。发生错误。再次在Paint中打开它并将其保存为png。没有错误!!!!这就是为什么我真的很困惑。是的,我已经尝试过不处理图像。没有帮助
我知道这可能是一个愚蠢的问题,但我拼命地卡在这里:)
感谢您的进阶
【问题讨论】:
可能,您已经使用Clone
克隆了文件句柄,关闭了文件,而 GDI 出于某种原因正在处理垃圾邮件……这只是一个猜测。克隆有一些严重的怪癖,我要做的第一件事就是尝试另一种方式
当它因 GDI+ 错误而失败时,您是否从您构建的 Linq 返回了一个有效的编解码器?
【参考方案1】:
我不知道为什么我的代码不起作用,但我只是用下面的代码替换了我的加载方法。它正在释放文件,同时按应有的方式工作。
public static Image LoadImageFromFile(string fileName)
using (Bitmap bmb = new Bitmap(fileName))
MemoryStream m = new MemoryStream();
bmb.Save(m, ImageFormat.Bmp);
return Image.FromStream(m);
【讨论】:
以上是关于图像到字节数组失败“GDI+ 中发生一般错误。”的主要内容,如果未能解决你的问题,请参考以下文章
使用带有内存流的 c# 在控制台应用程序中保存图像时,GDI + 中发生一般错误
c#中利用system.timers多线程做图像处理,图像保存时提示“GDI+ 中发生一般性错误”,如何解决?
System.Runtime.InteropServices.ExternalException: GDI+ 中发生一般性错误。