当我尝试将WPF图像的源设置为大小约为11MB的图像文件并在14 MeagaPixcel相机中拍摄时,当图像在屏幕上呈现时内存也会突然增加到大约170 MB渲染后降下来。 如果我尝试使用.Net 2.0 Picturebox控件做同样的事情,使用的内存只有.5MB到1MB。 从逻辑上讲,如果图像的文件大小是11MB,那么在渲染时它应该最多只占用11MB吗? WPF中此类行为的原因是什么?并且在屏幕上完成渲染之后有没有办法处理额外的内存?
答案 0 :(得分:2)
回答问题的第一部分:
在数码相机上拍摄的图像存储为jpg文件,因此会被压缩。读入内存时,它将被解压缩。这说明了您在这里看到的尺寸差异。
例如,在佳能EOS 450上拍摄的照片在磁盘上的文件大小为3 MB。它的尺寸是3072 x 2048.这导致内存大小为3072 * 2048像素* 24位/像素= 18,874,368字节(这是否有意义 - 我从未100%确定这些计算)
在持有图像数据的对象超出范围并被垃圾回收清除之前,内存使用率不会降低。
例如,您需要与此代码类似的内容:
using (Image image = Image.FromFile(imageName))
{
// Non property item properties
FileName = imageName;
PixelFormat = image.PixelFormat;
Width = image.Size.Width;
Height = image.Size.Height;
foreach (PropertyItem pi in image.PropertyItems)
{
EXIFPropertyItem exifpi = new EXIFPropertyItem(pi);
this.propertyItems.Add(exifpi);
}
}
一旦我从图像中获得了所需的所有信息,using
语句就可以启动垃圾收集并释放内存。