创建文件夹内所有图像的缩略图

时间:2010-02-18 19:07:53

标签: c# performance gdi+

我试图使用Bitmap.GetThumbnailImage()函数为文件夹中的20多个图像生成缩略图。当我执行以下过程时(在任务管理器内存中使用大约600,000K),我可以看到应用程序的巨大内存峰值。

foreach (var image in ListOfImages)
{
    var thumbnailFolder = @"\thumb";
    var thumbnailFile = thumbnailFolder + "\\" + image.Name;

    if (!Directory.Exists(thumbnailFolder))
    {
        Directory.CreateDirectory(thumbnailFolder);
    }
    if (!File.Exists(thumbnailFile))
    {
        using (FileStream fs = new FileStream(image.FullName, FileMode.Open, FileAccess.Read))
        {
            Image origImage = Image.FromStream(fs);
            var thumbnail = origImage.GetThumbnailImage(90, 120, null, IntPtr.Zero);
            thumbnail.Save(thumbnailFile);
            thumbnail.Dispose();
            origImage.Dispose();
        }
    }
}

有没有办法减少缩略图生成的内存使用量?

2 个答案:

答案 0 :(得分:2)

尝试使用WPF。

根据我的经验,WPF的图像操作得到了很好的优化(实际上它是正在使用的WIC库),并且在设计时考虑了线程,并且它不依赖于像GDI +那样的GDI位图处理。我读过一次,服务器代码不支持GDI +,因为它不是完全无泄漏的。对于您的方案,WPF不需要3D视频卡。

WPF的BitmapDecoder甚至还具有内置的缩略图功能,如果可用,它将利用图像本身的缩略图。有关WPF中的基本图像任务,请参阅http://msdn.microsoft.com/en-us/library/ms750864(VS.85).aspx。要访问WPF,您需要引用WindowsBase程序集(.net 3.0或更高版本)。

答案 1 :(得分:1)

不要使用Image.FromStream,而是出于内存原因使用Image.FromFile。坦率地说,我认为出于质量原因你最好适应这个例子:

http://www.webcosmoforums.com/asp/321-create-high-quality-thumbnail-resize-image-dynamically-asp-net-c-code.html