在我的C#应用程序加载表单中,我加载30张图片,这使我的内存已满,如果添加更多图片,我将收到消息“我的内存已满”
答案 0 :(得分:1)
1 /我如何使我的内存变空或更大?
您是否收到OutOfMemoryException并且计算机中的内存未满?这可能是由于x86编译引起的,您应该将其更改为x64。
2 /还有什么其他方法可以将我的所有照片保存到图片框中而又不会使我的存储空间变满?
是,不是。如果使用的是位图,它将在内存中分配图像。如果您稍后将所有图像放在一起重新创建图像而不进行压缩,那么如果未正确处理位图,可能还会丢失一些内存。您可以加载它们,然后压缩它们,然后处置原始的,将压缩/优化的一个保存在内存中。
此外,请记住在使用位图后始终对其进行处置。 GC通常会照顾它们,但是您应该始终将它们处置:
using (Bitmap bitmap = new Bitmap("file.jpg")
{
// bitmap handling here
}
当然,如果您将其显示在图片框中,则不能将其丢弃,但是同样,您对问题的理解也不完全清楚。
没有您的代码,我无法为您提供更好的答案,如果您更新问题,我将很乐意对此进行编辑。
阅读:
Compress bitmap before sending over network
When do I need to use dispose() on graphics?
更新
修复线程后,我注意到您已提供图像,但格式已损坏。
阅读我的回答,它将对您有所帮助(特别是压缩的一部分)。您也可以更改为x64。
更新2-压缩代码示例
public void ExampleMethod()
{
pictureBox1.Image = GetCompressedFile("file.jpg", quality: 10);
}
private Image GetCompressedFile(string fileName, long quality)
{
using (Bitmap bitmap = new Bitmap(fileName))
{
return GetCompressedBitmap(bitmap, quality);
}
}
private Image GetCompressedBitmap(Bitmap bmp, long quality)
{
using (var mss = new MemoryStream())
{
EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
ImageCodecInfo imageCodec = ImageCodecInfo.GetImageEncoders().FirstOrDefault(o => o.FormatID == ImageFormat.Jpeg.Guid);
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = qualityParam;
bmp.Save(mss, imageCodec, parameters);
return Image.FromStream(mss);
}
}
在质量参数中设置质量。 100表示100%,50表示50%。
尝试将质量设置为10,然后查看是否可行。
从代码中删除所有位图bmp =新的位图,并显示为PictureBoxInstance.Image = GetCompressedFile(...);
检查ExampleMethod()
。
基于以下代码:https://stackoverflow.com/a/48274706/4352946
您必须记住,即使使用Dispose,也不会立即释放内存,您应该等待GC。