【发布时间】: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