图像到字节数组失败“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 + 中发生一般错误

GDI+中发生一般性错误

c#中利用system.timers多线程做图像处理,图像保存时提示“GDI+ 中发生一般性错误”,如何解决?

C#picturebox覆盖保存GDI+ 中发生一般性错误

System.Runtime.InteropServices.ExternalException: GDI+ 中发生一般性错误。

GDI+ 中发生一般性错误。 究竟是啥问题不是一般性的图片上传出错。