Как эффективно масштабировать и обрезать изображения в приложении ASP.NET? - PullRequest
4 голосов
/ 19 марта 2009

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

Ответы [ 6 ]

4 голосов
/ 19 марта 2009

У меня была та же проблема, решение состояло в том, чтобы использовать 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;
        }
    }
3 голосов
/ 17 ноября 2011

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

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

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

enter image description here

3). Найдите и установите ImageResizing
enter image description here

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);

Попробуйте !!! это очень удивительный и простой в использовании. спасибо.

1 голос
/ 19 марта 2009

На CodeProject есть отличная статья. Действительно очень хороший. Постараюсь найти ссылку (использовал ее около 4 лет назад).

ОБНОВЛЕНИЕ:

Не тот, который я искал, но тоже хорошо выглядит.

http://www.codeproject.com/KB/custom-controls/ImageCroppingControl.aspx

1 голос
/ 19 марта 2009

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

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

1 голос
/ 19 марта 2009

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

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

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

Кев

0 голосов
/ 19 марта 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...