Математика для изменения размера изображения в пределах максимальной высоты и максимальной ширины - PullRequest
2 голосов
/ 09 сентября 2010

Для данного изображения:

maxWidth = 400;
maxHeight = 200;
width = photo.Width;
height = photo.Height;

Как бы мне было масштабировать изображение, если какое-либо измерение превышает максимальные свойства?

Вот несколько тестов:

300x300  :   Too tall, but width ok.
500x200  :   Too wide, but height ok.
650x300  :   Too tall and too wide
300x190  :   Fine, don't resize

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

Ответы [ 3 ]

11 голосов
/ 09 сентября 2010

Отдельно вычислите требуемое вертикальное и горизонтальное масштабирование, затем выберите меньшее из двух и ограничьте результат максимум 1. В коде:

scale = min(1, min(maxWidth/photo.Width, maxHeight/photo.Height))

Убедитесь, что в операциях деления используется арифметика с плавающей точкой. Как это сделать, зависит от языка. В C / Java / C # и т. П. Приведите один из операндов для плавания.

2 голосов
/ 09 сентября 2010

Вычислить два отношения (с результатом с плавающей запятой):

  • ширина ввода, деленная на максимально допустимую ширину
  • высота ввода делится на максимально допустимую высоту

Тогда

  • , если оба отношения <1,0, не меняйте размер. </li>
  • если одно из соотношений> 1,0, уменьшите на этот коэффициент.
  • , если оба отношения> 1,0, уменьшите значение большего из двух факторов.
0 голосов
/ 09 сентября 2010

Моя математика довольно плохая, но, если вы хотите пропорциональную шкалу, я бы решил ее так:

if maxWidth < photo.Width
    width = 'too big'
if maxHeight < photo.Height
    height = 'too big'

if height == 'to big' & width == 'too big' 
    x = photo.Width / maxWidth;
    y = photo.Height / maxHeight;
    if x > y
        scale_by_width(photo)
    else
        scale_by_height(photo)

elseif height == 'too big'
    scale_by_height(photo)

elseif width == 'too big'
    scale_by_width(photo)

else
    do_nothing
...