Веб-страницы ASP.NET — использование WebImage для изменения размера и сохранения фотографии

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

Это работает для изображений меньшего размера (в размере файла), но изображения, которые я хочу изменить, взяты из моей цифровой зеркальной фотокамеры, и они могут достигать 14 МБ в формате jpeg. Я получил следующую ошибку...

Maximum request length exceeded.

Я добавил web.config со следующим кодом:

<?xml version="1.0"?>

<configuration>

    <system.web>
        <compilation debug="false" targetFramework="4.0" />
        <httpRuntime maxRequestLength="20480" />  
    </system.web>

</configuration>

Я больше не получаю ошибку, но на самом деле это ничего не делает. Он по-прежнему работает с меньшими изображениями.

Я использовал учебник здесь: http://www.asp.net/web-pages/tutorials/files,-images,-and-media/9-working-with-images

Мой код выглядит следующим образом:

@{  WebImage photo = null;
    var newFileName = "";
    var imagePath = "";
    var imageThumbPath  = "";

    if(IsPost){
        photo = WebImage.GetImageFromRequest();
        if(photo != null){
            newFileName = "Original_" + Path.GetFileName(photo.FileName);
            imagePath = @"images\" + newFileName;
            photo.Save(@"~\" + imagePath);

            newFileName = "Thumbnail_" + Path.GetFileName(photo.FileName);
            imagePath = @"images\" + newFileName;
            photo.Resize(width: 60, height: 60, preserveAspectRatio: true, preventEnlarge: true);
            photo.Save(@"~\" + imagePath);        
        }
    }
}

<!DOCTYPE html>

<html>
<head>
   <title>Resizing Image</title>
</head>

<body>

    <h1>Thumbnail Image</h1>
    <form action="" method="post" enctype="multipart/form-data">
        <fieldset>
            <legend> Creating Thumbnail Image </legend>

            <label for="Image">Image</label>
            <input type="file" name="Image" />
            <br/>
            <input type="submit" value="Submit" />
        </fieldset>
    </form>

</body>
</html>

Любые идеи, почему это не работает для больших изображений. Любая помощь приветствуется!


person Gareth Lewis    schedule 14.03.2012    source источник


Ответы (1)


Класс Microsoft WebImage действительно, действительно плохой. После прочтения исходников и обнаружения ~10 критических ошибок на первых двух-трех страницах я отказался от этого. Это не безопасно для сервера.

Моя библиотека imageresizing.net предназначена для работы на сервере и намного лучше управляет памятью. Для зеркальных фотографий вам все равно потребуется около 100-200 МБ оперативной памяти для распаковки одного изображения, но если она у вас есть, она должна выполнять свою работу достаточно надежно. Он успешно используется с изображениями размером в гигапиксель, поэтому ваша зеркальная фотокамера будет простой, если у вас есть чайная ложка оперативной памяти.

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

Однако, поскольку библиотека чрезвычайно работает быстро и предназначена для поддержки изображений из одного источника, вы можете рассмотреть возможность сохранения оригинала и динамического создания эскизов. плагин DiskCache кэширует их на диск в виде статических файлов, обслуживаемых IIS, что обеспечивает высокую производительность.

person Lilith River    schedule 26.03.2012
comment
Очень исчерпывающий ответ. Спасибо. - person Gareth Lewis; 27.03.2012
comment
Спасибо, что поделились этим. У меня возникла странная проблема с методом GetBytes() внутри WebImage. Перешел на эту библиотеку и все заработало. - person Chris Kolenko; 05.09.2012
comment
Привет @Computer Linguist, мне интересно, не могли бы вы пролить свет на критические ошибки, которые вы нашли, и почему это «действительно очень плохо»? Мне просто любопытны подробности, так что я избегаю этого не только потому, что так сказал какой-то парень в стеке. - person JDandChips; 04.09.2013
comment
Последний исходный код WebImage.cs. Это приводит к множеству артефактов изображения (черная/серая рамка на многих результирующих изображениях, плохое качество компоновки изображений, плохое качество изменения размера, плохой размер результирующего файла. I задокументировал большинство этих ловушек в 2009 году, но, похоже, они этого не заметили. - person Lilith River; 04.09.2013
comment
Похоже, что некоторые утечки памяти были исправлены с 2012 года (за заметным исключением утечки результирующего изображения (tempImage), если есть какое-либо исключение). Он по-прежнему довольно неэффективен в том, как он применяет преобразования изображений, но кодовая база уже не такая страшная (с точки зрения стабильности/безопасности), как раньше. Тем не менее, по-прежнему нет оправдания артефактам передискретизации и границ, это просто элементарно. - person Lilith River; 04.09.2013
comment
Имейте в виду - обычно легко непреднамеренно (или намеренно) вызвать исключение в коде изображения, поэтому утечка всего растрового изображения в памяти (даже если это происходит только тогда, когда что-то идет не так) может быть серьезной. Один большой файл в формате CMYK jpeg (при стократной обработке с помощью WebImage) может вывести из строя средний сервер. (100 (раз) x 8 (мегапикселей) x 4 (байт на 32-битный пиксель)) = 3,2 ГБ неотслеживаемого использования памяти. (Джпеги CMYK загружаются и проверяются, но происходит сбой при попытке преобразовать их на WS2008R2+). - person Lilith River; 04.09.2013
comment
Хорошо. Это просто фантастика. Для всех прохожих, если вы ищете решение для веб-изображения - это оно. - person Terrance00; 02.09.2016