C # MVC размер изображения загрузки изменения размера на стороне сервера - PullRequest
7 голосов
/ 19 января 2011

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

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

  1. Пользователь загружает изображение
  2. Размер изображения изменяется до 7,500 x 7,500 в пикселях с разрешением 72 т / д
  3. Изображение сохраняется в базе данных
  4. Оригинальный файл удаляется

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

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

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 ]

3 голосов
/ 19 января 2011

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

Однако следует отметить, что приведенный выше код, вероятно, слишком прост, если ваши пользователи могут загружать изображения во всех видах форматов. Базовая библиотека (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);
        }
    }
}
2 голосов
/ 19 января 2011

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

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

1 голос
/ 19 января 2011

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

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