Изменение размера изображения после загрузки его из базы данных с использованием asp.net, C # - PullRequest
1 голос
/ 03 декабря 2009

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

Используя javascript для изменения его размера, сохраняя при этом пропорции, он некоторое время печатал нормально. После добавления поля для стиля принтер начал печатать изображение в полном размере. Я предполагаю, что это запас. На экране это выглядит хорошо, но все выталкивает со страницы на бумагу.

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

Возможно, я ищу не в том месте и мне нужно вернуться к клиенту. Совет и помощь приветствуются.

Ответы [ 5 ]

0 голосов
/ 28 мая 2011

Отказ от ответственности: я предлагаю библиотеку с открытым исходным кодом, которую я разработал для этой цели. Я определенно предвзят, но 4 года и тысячи счастливых пользователей оправдывают мою предвзятость:)

Вы не должны изменять размеры изображений на странице .ASPX или обслуживать их. Изображения должны обрабатываться в отдельных запросах модулем HttpModule, чтобы оперативность не страдала.

Если у вас есть какой-то идентификатор в SQL для каждого изображения, вы можете использовать SqlReader VirtualPathProvider, чтобы сделать его доступным через URL, например / sqlimages / id

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

Вы просто будете ссылаться на изображения следующим образом: http://localhost/sqlimages/id?width=300&height=200 из своего HTML, и вам, возможно, даже не придется писать строку на C #.

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

Надеюсь, это поможет!

0 голосов
/ 03 декабря 2009

Пока ваша страница FileDownloader возвращает правильное изображение с измененным размером, не должно иметь значения, что вы не указываете на фактическое изображение.

Я бы хотел что-то подобное на вашей странице FileDownloader (псевдокод):

using (Image img = LoadImageFromDatabase())
{
    using (Image resized = ResizeImage(img))
    {
        Response.Clear();
        // Set proper headers
        using (MemoryStream ms = new MemoryStream())
        {
            resized.Save(ms); // maybe the function isn't called Save, can't remember a 100%
            ms.Seek(0); // Can't remember if this is necessary
            Response.BinaryWrite(ms);
        }
    }
}

Как я уже говорил, это очень псевдокод, но он должен быть простым с открытым Visual Studio, у меня просто нет к нему доступа сейчас, и прошло довольно много времени с тех пор, как я последний раз использовал это (так как сохраненные измененные изображения, как рекомендует большинство других в этом вопросе - я тоже так делаю, однако я понимаю, что это не вариант для вас)

0 голосов
/ 03 декабря 2009

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

После того, как вы это сделаете, вы можете беспокоиться об определении макета печати на основе известных размеров измененного размера изображения, и вам не придется браться за изменение размера при каждом использовании.

0 голосов
/ 03 декабря 2009

Я бы предложил преобразовать при загрузке и, возможно, сохранить оба изображения на тот случай, если вы хотите, чтобы пользователь щелкнул до полного изображения. Используя эту модель, вы делаете преобразование только один раз и можете сделать изображение любого размера. Метод GetThumbnailImage () класса Image сделает то, что вы хотите, что-то вроде этого:

String imageFile = uploadedFileName;
Image baseImage = Image.FromFile(imageFile);
Image thumbImage = baseImage.GetThumbnailImage(300,300,..., ...);
SaveMyImage(baseImage);
SaveMyImage(thumbImage);

Обязательно ознакомьтесь с документацией параметров GetThumbnailImage () для проверки проблем масштабирования и обработки обратного вызова.

0 голосов
/ 03 декабря 2009

Не могли бы вы реализовать такой процесс:

  • Пользователь отправляет изображение
  • Изображение открывается функцией / рутиной / скриптом, пока пользователь ждет
  • Размер изображения на лету изменяется и сохраняется в правильном месте, которое возвращает код успеха
  • Пользователь получает сообщение в зависимости от возвращаемого значения скрипта.

EDIT:

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

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

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