【问题标题】:How can i clear the memory after converting BitmapImage to Byte将 BitmapImage 转换为 Byte 后如何清除内存
【发布时间】:2020-04-12 07:49:16
【问题描述】:

我有两个功能:一个是从图像转换为字节,另一个是从字节转换为位图图像。 因此,当我打开带有该图像的窗口时,我从字节转换为 bitmapImage 并且效果很好,但是当我关闭并再次打开它时,它只会保留在内存中,如果我一次又一次地继续这样做,它只会抛出一个异常Out Of Memory exception

图像到字节->

       private byte[] ConvertImageToBinary(Image img)
        {
            using (MemoryStream ss = new MemoryStream())
            {
                img.Save(ss, System.Drawing.Imaging.ImageFormat.Jpeg);
                var s = ss.ToArray();
                var jpegQuality = 50;
                Image image;
                using (var inputStream = new MemoryStream(s))
                {
                    image = Image.FromStream(inputStream);
                    var jpegEncoder = System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders()
                      .First(c => c.FormatID == System.Drawing.Imaging.ImageFormat.Jpeg.Guid);
                    var encoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
                    encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, jpegQuality);
                    Byte[] outputBytes;
                    using (var outputStream = new MemoryStream())
                    {
                        image.Save(outputStream, jpegEncoder, encoderParameters);
                        return outputBytes = outputStream.ToArray();
                    }
                }
            }

        }

字节到位图 ->

 public BitmapImage ConvertBinaryToImage(byte[] array)
        {
            var image = new BitmapImage();
            using (var ms = new MemoryStream(array))
            {
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad; // here
                image.StreamSource = ms;
                image.EndInit();
                image.Freeze();
            }
            return image;
        }

当我打开 WindowDragAndDrop 时,它会加载所有图像

但是当我关闭它时,它仍然使用相同数量的内存

【问题讨论】:

  • 您是否尝试过GC.Collect,如果它没有帮助您不处理所有对象或至少保留对它们的引用?你还会再次使用同一个窗口实例吗?
  • 是的,是同一个window实例,我关闭它然后再次打开它从db中收集数据。
  • using 语句应该自动配置哪些释放内存。返回内存必须在父代码中处理。
  • “图像”类是否需要处理? |实际上,那是哪个 Image 类?有好几个。

标签: c# memory out-of-memory


【解决方案1】:

图片确实是一次性的(https://docs.microsoft.com/en-us/dotnet/api/system.drawing.image?view=netframework-4.8),所以你还需要:

using (var image = Image.FromStream(inputStream)){

}

到处都是你使用 Image 对象的地方。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多