c# - 将 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 时,它会加载所有图像
但是当我关闭它时,它仍然使用相同数量的内存
解决方案
图片确实是一次性的(https://docs.microsoft.com/en-us/dotnet/api/system.drawing.image?view=netframework-4.8),所以你还需要:
using (var image = Image.FromStream(inputStream)){
}
在您使用 Image 对象的任何地方。
推荐阅读
- google-tag-manager - 谷歌标签管理器 - 在环境中默认显示调试栏?
- r - tidyr::complete 带有可变长度的列名向量
- azure-devops - 无法连接到 Octopus Deploy 服务器
- mysql - 如何解决 vb.net 应用程序中的 mysql 定义错误?
- git - Github 创建新分支
- android - 如何从用户对象中获取值?
- java - 在处理器类中使用实例变量可能会导致竞争条件吗?
- c# - 使用 C# 解析嵌套的 Json 数据。无法访问内部元素消耗
- reactjs - Reactjs:在新选项卡中打开链接在开发中工作正常,但在生产中状态码 404
- html - HTML 验证器错误 - 在此上下文中不允许元素滑块作为元素主体的子元素