Алгоритм справки для генерации изображения на лету - PullRequest
1 голос
/ 21 января 2011

Я хочу создать помощника для генерации изображений.Мы собираемся добавить его в решение C #.Тем не менее, я не бэкэнд-разработчик, поэтому я просто создам фиктивный пример и объясню своими словами здесь: -)

Обновление: Зачем мне нужна помощь?рассчитать масштабирование для каждого из нижеприведенных сценариев.Например, если у меня заполнитель для миниатюр размером 60x60, а исходное изображение имеет размер 400x300, мне нужно установить 300 на 60 и соответственно изменить 400.

Помощник будет выглядеть примерно так:

HelperName('OriginalImageUrl', 'FileName', X, Y, M)

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

Thumnails (квадрат): ширина и высота одинаковы, поэтому, вероятно, следует использовать самый короткий размер изображения.

ImagePlaceholder (в основном прямоугольный): статическая высота / ширина.Изображение должно заполнять как высоту, так и ширину, чтобы в заполнителе не было пустых областей.То, что чрезмерно в одном из измерений, будет обрезано.Вероятно, может быть объединен с миниатюрой только с проверкой размеров, если ширина! = Высота, чтобы определить, квадрат это или нет.

PhotoWrapper: максимальная высота / ширина.Все изображение будет отрегулировано в соответствии с этими пропорциями.Нет обрезки, просто базовое изменение размера, чтобы соответствовать 2 заданным размерам контейнера.

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

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Вы можете рассчитать коэффициент масштабирования, а затем прямоугольники ввода / вывода. Должно быть что-то вроде этого (не проверял):

Место:

double scaleX=(double)targetWidth/(double)originalWidth;
double scaleY=(double)targetHeight/(double)originalHeight; 

double scaleToFit=Math.Min(scaleX,scaleY);

double newWidth=scaleToFit*originalWidth;
double newHeight=scaleToFit*originalHeight;

double borderX=(targetWidth-newWidth)/2;
double borderY=(targetHeight-newHeight)/2;

Rect InputRect=new Rect(0,0,originalWidth,originalHeight);
Rect OutputRect=new Rect(borderX,borderY,targetWidth-2*borderX,targetHeight-2*borderY);

Наполнитель:

double scaleX=(double)targetWidth/(double)originalWidth;
double scaleY=(double)targetHeight/(double)originalHeight; 

double scaleToFill=Math.Max(scaleX,scaleY);

double oldWidth=targetWidth/scaleToFill;
double oldHeight=targetHeight/scaleToFill;

double cropX=(originalWidth-oldWidth)/2;
double cropY=(originalHeight-oldHeight)/2;

Rect OutputRect=new Rect(0,0,targetWidth,targetHeight);
Rect InputRect=new Rect(cropX,cropY,oldWidth,oldHeight);

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

0 голосов
/ 21 января 2011
  1. Загрузка изображения из URL в byte[]
  2. Создание Image из byte[]
  3. Манипуляции Image
  4. СохранитьImage на диск и подачу URL или потока напрямую через веб-обработчик

byte[] можно заменить на Stream.

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