У нас проблемы с приложением 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 ().