Создание эскиза всех изображений внутри папки - PullRequest
2 голосов
/ 18 февраля 2010

Я пытался сгенерировать миниатюры, используя функцию Bitmap.GetThumbnailImage () для 20+ изображений в папке. Я мог видеть огромный всплеск памяти приложением, когда оно выполняет следующую процедуру (около 600 000 КБ в использовании Mem Manager).

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 ]

2 голосов
/ 18 февраля 2010

Попробуйте использовать 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 или выше).

1 голос
/ 18 февраля 2010

Не используйте Image.FromStream, вместо этого используйте Image.FromFile по соображениям памяти. Честно говоря, я думаю, что вам лучше адаптировать этот пример по соображениям качества:

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

...