ASP.NET Изменение размера изображения - PullRequest
3 голосов
/ 01 октября 2009

Нам нужна возможность изящно изменить размер любой фотографии / изображения до точной ширины / высоты без искажения изображения. Мы можем использовать стороннее решение или встроенную функциональность .NET, чтобы справиться с этим. Я думал, что должно быть простое решение этого вопроса без программирования сложного алгоритма.

Пример сценария (мы хотим, чтобы размер всех загрузок был увеличен до 200x100 пикселей)
Пейзажное фото с размерами 1250x800:
Изменение ширины до 200px пропорционально увеличит высоту до 128px, так что дополнительные 28px будут обрезаны сверху и снизу.

Пейзажное фото с размерами 1250x500:
Изменение ширины до 200px пропорционально увеличит высоту до 80px, поэтому нам нужно будет это отловить и сначала изменить размер по высоте. Установка высоты в 100px пропорционально установит ширину в 250px. Дополнительные 50 пикселей должны быть обрезаны по бокам фотографии.

Портретное фото с размерами 800x950:
Изменение ширины до 200px пропорционально увеличит высоту до 238px, так что дополнительные 138px будут обрезаны сверху и снизу.

Ответы [ 6 ]

1 голос
/ 02 октября 2009

Вы можете сделать это с помощью класса Bitmap , например:

using (Bitmap original= new Bitmap(...)) {   //A stream or a filename
    //Calculate the desired size using original.Height and original.Width

    Bitmap newImage = new Bitmap(newWidth, newHeight);

    using(Graphics g = Graphics.FromImage(newImage) {

Вызовите эту перегрузку g.DrawImage, чтобы нарисовать обрезанную часть исходного изображения на новом изображении.

    }
}
1 голос
/ 02 октября 2009

Если бы я был дома, я бы дал вам свой код для обработки этого.

Однако, вы можете найти что-то похожее на то, что вы ищете здесь: http://www.codeproject.com/KB/aspnet/resizeimg_emanuele_briano.aspx

Редактировать

Это лучшая ссылка. http://www.codeproject.com/KB/graphics/ImageResizingManager.aspx

0 голосов
/ 22 января 2014

Вы можете видеть в этом посте кто-то только что создал пример приложения для изменения размера изображения.

Они также предоставляют Class Image Resizer для справки.

Образец Resizer Image в C #
Image Resizer Class C #

0 голосов
/ 02 октября 2009

Я столкнулся с той же самой вещью некоторое время назад. Вот статья, в которой я использовал высококачественное изменение размера изображения с помощью .net . JPG изображения работают лучше всего. Не удалось получить хорошие результаты с изображениями в формате GIF.

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

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

Вот небольшая статья о обрезанном изображении .

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

0 голосов
/ 02 октября 2009

GDI + отлично работает в ASP.NET. (WPF раньше, но не сейчас).

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

Кроме того, я обнаружил, что подход, основанный на стеке, хорошо работает для представления преобразований:

http://www.hackification.com/2008/10/29/stack-based-processing-part-2/

0 голосов
/ 02 октября 2009

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

Измените размер изображения 1250x800 до 156,25x100. Полученное изображение затем может быть центрировано в пределах кадра 200x100. Если это пользователь, выполняющий задачу, у вас может быть опция предварительного просмотра, которая позволяет ему увидеть, находится ли его масштабированное изображение в желаемых пределах

...