开发者

Creating thumbnail of all the images inside a folder

开发者 https://www.devze.com 2022-12-20 10:00 出处:网络
I was trying to generate thumbnails using Bitmap.GetThumbnailImage() function for 20+ images in a folder. I could see huge memory spike by the application when it does the following procedure (about 6

I was trying to generate thumbnails using Bitmap.GetThumbnailImage() function for 20+ images in a folder. I could see huge memory spike by the application when it does the following procedure (about 600,000K in Task Manager mem usage).

foreach (var image in ListOfImages)
{
    var thumbnailFolder = @"\thumb";
    va开发者_开发技巧r 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();
        }
    }
}

Is there any way to reduce this much memory usage for thumbnail generation?


Give it a try using WPF.

In my experience WPF's image operations quite well optimized (actually it is the WIC library that's being used), and designed with threading in mind, and it does not depend the GDI bitmap handles like GDI+ does. I read once that GDI+ is not supported in server code because it is not entirely leakfree. For your scenario, WPF does not need a 3D video card.

WPF's BitmapDecoder even has built-in thumbnail functionality, which will take advantage of thumbnails in the image itself if available. See http://msdn.microsoft.com/en-us/library/ms750864(VS.85).aspx for basic image tasks in WPF. To access WPF, you need to reference the WindowsBase assembly (.net 3.0 or better).


Do not use Image.FromStream, use Image.FromFile instead for memory reasons. Frankly, I think you'd be better to adapt this example for quality reasons:

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

0

精彩评论

暂无评论...
验证码 换一张
取 消