У нас проблемы с приложением ASP.NET, которое позволяет пользователям загружать и обрезать изображения. После этого все изображения масштабируются до фиксированного размера. Обычно у нас заканчивается память при обработке большого файла; кажется, что обработка JPEG довольно неэффективна - мы используем System.Drawing.BitMap. Есть ли у вас какие-нибудь общие советы и, возможно, несколько указателей на более эффективную библиотеку обработки изображений? Какой у вас опыт?
Как эффективно масштабировать и обрезать изображения в приложении ASP.NET?
Ответы (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;
}
}
Я нашел 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);
Пытаться!!! его очень просто и удобно. благодаря.
На ум приходит пара мыслей -
Какой размер изображений вы разрешаете пользователям загружать и можете ли вы наложить на это ограничения?
Когда вы используете класс
System.Drawing.Bitmap, не забываете ли вы правильно от него избавиться? Мы обнаружили, что одной из основных причинSystem.OutOfMemoryExceptionисключений на нашей платформе общего хостинга была неправильная утилизацияBitmapобъектов пользователями.
Кев
В .net была более старая ошибка, из-за которой для всех изображений по умолчанию использовалось 32 бита на пиксель - при таком размере вы можете довольно быстро исчерпать свою память. Пожалуйста, используйте структуру PixelFormat, чтобы убедиться, что это не так.
Эта ссылка может помочь: http://msdn.microsoft.com/en-us/library/aa479306.aspx
Возможно, у вас есть трассировка стека, чтобы посмотреть?
Я также немного отредактировал изображения после того, как пользователь загрузил изображение. Единственными проблемами, с которыми я столкнулся, были ограничения на размер загружаемых файлов в браузерах и тайм-ауты. Но ничего, связанного с библиотеками .Net.
Есть еще кое-что, что нужно учесть. Если вы делаете несколько изображений или где-то у вас есть опасный цикл, то обязательно ли вы выполняете функции flush () и dispose ().