首页 > 解决方案 > 将 BitmapImage 转换为 Byte 后如何清除内存

问题描述

我有两个功能:一个是从图像转换为字节,另一个是从字节转换为位图图像。因此,当我打开带有该图像的窗口时,我从字节转换为 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 时,它会加载所有图像

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

标签: c#memoryout-of-memory

解决方案


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

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

}

在您使用 Image 对象的任何地方。


推荐阅读