使用WPF图像控件渲染时,大小约为11MB的图像文件会占用大量内存

时间:2009-06-30 09:24:19

标签: performance image-processing rendering

当我尝试将WPF图像的源设置为大小约为11MB的图像文件并在14 MeagaPixcel相机中拍摄时,当图像在屏幕上呈现时内存也会突然增加到大约170 MB渲染后降下来。 如果我尝试使用.Net 2.0 Picturebox控件做同样的事情,使用的内存只有.5MB到1MB。 从逻辑上讲,如果图像的文件大小是11MB,那么在渲染时它应该最多只占用11MB吗? WPF中此类行为的原因是什么?并且在屏幕上完成渲染之后有没有办法处理额外的内存?

1 个答案:

答案 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语句就可以启动垃圾收集并释放内存。