system.drawing.image中的'System.OutOfMemoryException'

时间:2018-09-11 12:00:59

标签: c# asp.net arrays

我以字节数组的形式存储我的网站图像,但是当我尝试将其保存为jpeg文件时,此文件中的某些文件会引发异常。这是我获取图像的代码:

IList<PropertyInfo> properties = typeof(ApplicationUser).GetProperties()
                               .Where(x => x.PropertyType == typeof(Byte[])).ToList();

var imaBytes = property.GetValue(user, null) as Byte[];
if (imaBytes == null || imaBytes.Length == 0) continue;

Image userImage = ImageHelper.byteArrayToImage(imaBytes);   
userImage.Save(pathname + $@"\{DirName}\" + property.Name + ".jpg", ImageFormat.Jpeg);  

这是我的ImageHelper.byteArrayToImage

public static Image byteArrayToImage(byte[] byteArrayIn)
{
    try
    {
        using (MemoryStream ms = new MemoryStream(byteArrayIn))
        using (var image = Image.FromStream(ms,false,true))
        {
            byteArrayIn = new byte[0];
            return new Bitmap(image); 
        }
    }
    catch (Exception e)
    {
       Logger.log(e);
    }
}

编辑:
我使用声明包装MemoryStream和Image代码,并更改代码并添加ImageToDisk方法:

public static void ImageToDisk(byte[] byteArrayIn, string pathToSave)
    {
        try
        {
            using (MemoryStream ms = new MemoryStream(byteArrayIn))
            {
                using (var image = Image.FromStream(ms, false, true))
                {
                    image.Save(pathToSave, ImageFormat.Jpeg);
                    image.Dispose();

                }

            }
        }
        catch (Exception e)
        {
            Logger.log(e);
            throw;
        }

    }  

和主要代码是这个

 foreach (var property in properties)
                    {
                        try
                        {
                            var imaBytes = property.GetValue(user, null) as Byte[];
                            if (imaBytes == null || imaBytes.Length == 0)
                            {
                                continue;
                            }

                            ImageHelper.ImageToDisk(imaBytes, pathname + $@"\{DirName}\" + property.Name + ".jpg");

                        }
                        catch (Exception ex)
                        {
                            LogException(ex);
                        }
                    }  

但现在获得system.runtime.interopservices.externalexception
编辑2:
我完全头晕!似乎有些用户从IE和IE上传图像,将MIME类型更改为image / PJPEG
enter image description here
发生错误的原因是某些具有此MIME类型的文件,但还有其他image/PJPEG个文件正确保存而没有任何异常
enter image description here 我该如何解决这个错误?

1 个答案:

答案 0 :(得分:3)

  

某些文件抛出异常

我几乎可以确定问题出在处理图像上。确保释放所有资源:

using (Image userImage = ImageHelper.byteArrayToImage(imaBytes))
{
  //do whatever you need
  userImage.Save(pathname + $@"\{DirName}\" + property.Name + ".jpg", ImageFormat.Jpeg);
}

位图会占用大量内存。 Image使用GdipLoadImageFromStream方法。要释放资源,应将其与GdipDisposeImage配对。这就是Image.Dispose()方法内部的情况。