代码之家  ›  专栏  ›  技术社区  ›  Raj

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

  •  2
  • Raj  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  2
  •   user180326user180326    14 年前

    尝试使用WPF。

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

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

        2
  •  1
  •   Keith Adler    14 年前

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

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