C# 创建文件夹中所有图像的缩略图

C# 创建文件夹中所有图像的缩略图,c#,performance,gdi+,C#,Performance,Gdi+,我试图使用Bitmap.GetThumbnailImage()函数为文件夹中的20多个图像生成缩略图。当应用程序执行以下过程时,我可以看到巨大的内存峰值(任务管理器内存使用量约为600000K) 有没有办法减少生成缩略图所需的大量内存?由于内存原因,请不要使用Image.FromStream,而是使用Image.FromFile。坦率地说,出于质量原因,我认为您最好采用此示例: 尝试使用WPF 根据我的经验,WPF的图像操作得到了很好的优化(实际上使用的是WIC库),并且在设计时考虑了线程,它不

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


有没有办法减少生成缩略图所需的大量内存?

由于内存原因,请不要使用Image.FromStream,而是使用Image.FromFile。坦率地说,出于质量原因,我认为您最好采用此示例:


尝试使用WPF

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


WPF的
BitmapDecoder
甚至具有内置的缩略图功能,如果可用,可以利用图像本身的缩略图。有关WPF中的基本映像任务,请参见。要访问WPF,您需要引用WindowsBase程序集(.net 3.0或更高版本)

根据我的经验,它的性能和System.Drawing命名空间中的函数一样差。当您说“as bad”时,您是否注意到该示例中它也会泄漏内存?不,它不会泄漏内存。但是内存使用率与System.Drawing一样高。可能是临时使用的内存没有被垃圾收集器回收,因为内存充足。假设大内存块的存活时间更长。您可以在每个图像后强制使用
System.GC.Collect()
来尝试此操作。对于没有缩略图的图像,该怎么办?这与System.Drawing.Image.GetThumbnailImage()的行为不同。。。
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();
        }
    }
}