Как эффективно масштабировать и обрезать изображения в приложении ASP.NET?

У нас проблемы с приложением ASP.NET, которое позволяет пользователям загружать и обрезать изображения. После этого все изображения масштабируются до фиксированного размера. Обычно у нас заканчивается память при обработке большого файла; кажется, что обработка JPEG довольно неэффективна - мы используем System.Drawing.BitMap. Есть ли у вас какие-нибудь общие советы и, возможно, несколько указателей на более эффективную библиотеку обработки изображений? Какой у вас опыт?


person Daniel Schierbeck    schedule 19.03.2009    source источник
comment
Я бы предложил библиотеку imageresizing.net - она ​​правильно обрабатывает использование памяти и избавляет вас от необходимости вручную избегать более 28 ловушек, по которым MS предупреждает об использовании System.Drawing в ASP. NET-приложений.   -  person Lilith River    schedule 11.11.2011
comment
возможный дубликат Изменение размера изображения в asp.net без потери качества изображения   -  person Simone Carletti    schedule 17.11.2011


Ответы (5)


У меня была та же проблема, решение заключалось в использовании System.Drawing.Graphics для выполнения преобразований и удаления каждого объекта растрового изображения, как только я закончил с ним. Вот образец из моей библиотеки (изменение размера):

    public Bitmap ApplyTo(Bitmap bitmap)
    {
        using (bitmap)
        {
            Bitmap newBitmap = new Bitmap(bitmap, CalculateNewSize(bitmap));

            using (Graphics graphics = Graphics.FromImage(newBitmap))
            {
                graphics.SmoothingMode =
                    SmoothingMode.None;
                graphics.InterpolationMode =
                    InterpolationMode.HighQualityBicubic;
                graphics.CompositingQuality =
                    CompositingQuality.HighQuality;

                graphics.DrawImage(
                    bitmap,
                    new Rectangle(0, 0, newBitmap.Width, newBitmap.Height));
            }

            return newBitmap;
        }
    }
person Diadistis    schedule 19.03.2009
comment
Я делаю обрезку и масштабирование изображения аналогично этому. Ключевым моментом является размещение вашего кода в операторах using, которые затем автоматически удаляют ресурсы, как только вы оставите счет блока using. В противном случае данные изображения не будут утилизированы == трата памяти. - person Pure.Krome; 19.03.2009
comment
+1 за утилизацию. Я вижу, как наши клиенты все время забывают / не знают об этом. - person Kev; 19.03.2009
comment
Есть еще 28 других ловушек, на которые вы должны проверить свой код - это вероятно, не единственный, с которым вы столкнулись. - person Lilith River; 23.06.2011

Я нашел imageresizer, и это здорово. и хороший API. Работает отлично. Загружено из Visual Studio 2010 Extension Manager: http://nuget.org/.

Простые шаги для загрузки API в VS-2010:

1). Установите расширение http://nuget.org/.

введите описание изображения здесь

3). Найдите и установите ImageResizing
введите описание изображения здесь

4). Затем Код: (Я использую здесь кадрирование. Вы можете использовать любой) Документация на imageresizing.net

string uploadFolder = Server.MapPath(Request.ApplicationPath + "images/");
FileUpload1.SaveAs(uploadFolder + FileUpload1.FileName);


//The resizing settings can specify any of 30 commands.. See http://imageresizing.net for details.
ResizeSettings resizeCropSettings = new ResizeSettings("width=200&height=200&format=jpg&crop=auto");

//Generate a filename (GUIDs are safest).
string fileName = Path.Combine(uploadFolder, System.Guid.NewGuid().ToString());

//Let the image builder add the correct extension based on the output file type (which may differ).
fileName = ImageBuilder.Current.Build(uploadFolder + FileUpload1.FileName, fileName, resizeCropSettings, false, true);

Пытаться!!! его очень просто и удобно. благодаря.

person Muhammad Adnan    schedule 17.11.2011

На ум приходит пара мыслей -

  1. Какой размер изображений вы разрешаете пользователям загружать и можете ли вы наложить на это ограничения?

  2. Когда вы используете класс System.Drawing.Bitmap, не забываете ли вы правильно от него избавиться? Мы обнаружили, что одной из основных причин System.OutOfMemoryException исключений на нашей платформе общего хостинга была неправильная утилизация Bitmap объектов пользователями.

Кев

person Kev    schedule 19.03.2009

В .net была более старая ошибка, из-за которой для всех изображений по умолчанию использовалось 32 бита на пиксель - при таком размере вы можете довольно быстро исчерпать свою память. Пожалуйста, используйте структуру PixelFormat, чтобы убедиться, что это не так.

Эта ссылка может помочь: http://msdn.microsoft.com/en-us/library/aa479306.aspx

person Sesh    schedule 19.03.2009

Возможно, у вас есть трассировка стека, чтобы посмотреть?

Я также немного отредактировал изображения после того, как пользователь загрузил изображение. Единственными проблемами, с которыми я столкнулся, были ограничения на размер загружаемых файлов в браузерах и тайм-ауты. Но ничего, связанного с библиотеками .Net.

Есть еще кое-что, что нужно учесть. Если вы делаете несколько изображений или где-то у вас есть опасный цикл, то обязательно ли вы выполняете функции flush () и dispose ().

person uriDium    schedule 19.03.2009