C# MVC загрузка изображений изменение размера на стороне сервера

У меня есть веб-приложение, где пользователи могут загружать изображения. Текущая проблема, с которой я сталкиваюсь, заключается в том, что загружаемые изображения сохраняются в базе данных в исходном формате. Это вызывает много проблем с производительностью при использовании изображений на веб-странице. Я использовал dotTrace для профилирования приложения, и я вижу значительные проблемы при обработке изображений из базы данных.

идея состоит в том, чтобы изменить размер изображения при его загрузке на сервер. Взять следующий пример, который я хочу, чтобы приложение делало, когда пользователь загружает новое изображение;

  1. пользователь загружает изображение
  2. изображение изменяется до размера 7.500 x 7.500 в пикселях в 72 dpi
  3. изображение сохраняется в базе данных
  4. исходный файл будет удален

единственное сохраненное изображение-это упомянутое выше, и веб-приложение содержит технологию для изменения размера этого на лету.

Я уже прочитал несколько тем здесь на SO. И большинство из них указывают мне в направлении ImageMagick. Этот инструмент уже знаком в моей компании и используется в PHP-проектах. Но есть ли хорошие и стабильные выпущенные обертки C# для этого инструмента? Я уже нашел инструменты ниже, но они либо в выпуске Béta, Alpha Release, либо в настоящее время не обновляются.

ImageMagick.NET

ImageMagick приложение

Я тоже нашел этой тема на SO. В этом разделе приведен следующий пример кода;

private static Image CreateReducedImage(Image imgOrig, Size newSize)
{
    var newBm = new Bitmap(newSize.Width, newSize.Height);
    using (var newGrapics = Graphics.FromImage(newBm))
    {
        newGrapics.CompositingQuality = CompositingQuality.HighSpeed;
        newGrapics.SmoothingMode = SmoothingMode.HighSpeed;
        newGrapics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        newGrapics.DrawImage(imgOrig, new Rectangle(0, 0, newSize.Width, newSize.Height));
    }

    return newBm;
}

короче вопросы, которые у меня есть;

  • есть ли какие-либо преимущества в отношении производительности, используя пример выше?
  • есть ли хорошая и надежная оболочка C# для ImageMagick, которую я могу использовать для этого?

любые другие хорошие советы, касающиеся производительности приветствуются!

3 ответов


мы используем последний подход - я не могу комментировать производительность, но это, безусловно, упрощает обработку зависимостей.

однако следует отметить, что приведенный выше код, вероятно, слишком прост, если ваши пользователи могут загружать изображения во всех форматах. Базовая библиотека (GDI+) имеет проблемы с большим количеством цветовых форматов, но она также зависит от версии ОС. Вот ядро кода, который мы используем:

    // GDI+ has problems with lots of image formats, and it also chokes on unknown ones (like CMYK).
// Therefore, we're going to take a whitelist approach.
// see http://bmpinroad.blogspot.com/2006/04/file-formats-pixel-formats.html
// also see http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/c626a478-e5ef-4a5e-9a73-599b3b7a6ecc
PixelFormat format = originalImage.PixelFormat;

if (format == PixelFormat.Format16bppArgb1555 ||
    format == PixelFormat.Format64bppArgb)
{
    // try to preserve transparency
    format = PixelFormat.Format32bppArgb;
}
else if (format == PixelFormat.Format64bppPArgb)
{
    // try to preserve pre-multiplied transparency
    format = PixelFormat.Format32bppPArgb;
}
else if (format != PixelFormat.Format24bppRgb && format != PixelFormat.Format32bppRgb)
{
    format = PixelFormat.Format24bppRgb;
}


// GIF saving is probably still an issue.  If we ever need to tackle it, see the following:
// http://support.microsoft.com/kb/319061
// http://www.bobpowell.net/giftransparency.htm
// http://support.microsoft.com/kb/318343


using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, format))
{
    using (Graphics Canvas = Graphics.FromImage(newImage))
    {
        using (ImageAttributes attr = new ImageAttributes())
        {
            attr.SetWrapMode(WrapMode.TileFlipXY);

            Canvas.SmoothingMode = SmoothingMode.AntiAlias;
            Canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
            Canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
            Canvas.DrawImage(originalImage, new Rectangle(new Point(0, 0), newSize), srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, GraphicsUnit.Pixel, attr);
            newImage.Save(outputImageStream, originalImage.RawFormat);
        }
    }
}

Я никогда не использовал ImageMagic, но я использовал функции изменения размера изображения GDI+, в том числе на сайте, который генерирует и изменяет размер 100,000+ изображений в день без проблем с производительностью.

Я бы сказал, что использование методов GDI+ просто отлично. Не беспокойтесь об обертывании внешнего инструмента или фреймворка.


Я использовал ImageGen на сайтах Umbraco. (Это, конечно, не связано с Умбрако, это хорошо для любого ASP.NET app, так получилось, что некоторые из пакетов Umbraco, которые я использовал, требовали этого.) Он прост в использовании, и вы можете быть в состоянии уйти с бесплатной версией...