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

Соотношение сторон - это отношение ширины к высоте. В качестве альтернативы это можно выразить как ширину, разделенную на высоту; т.е. ширина 1024 / 768 высота = 1,33 или 4: 3.

Если вы измените размер изображения без сохранения соотношения сторон, оно будет растянуто или сжато, вот пример -

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

Хорошо, сначала предположим, что у вас есть предпочтительный размер (большой, средний и т. Д.). Сначала решите, какие будут области для ваших больших, средних и маленьких изображений. Вообще говоря, если ваш предпочтительный размер для большого изображения составляет 1024 × 768, тогда область изображения будет 1024 пикселей × 768 пикселей = 786432 пикселей². Каким бы ни было разрешение изображения, мы сохраним эту область как наше большое изображение без нарушения соотношения сторон.

Давайте решим

Давайте решим один размер, например большой; то эту процедуру / метод можно использовать для любого размера. Теперь предположим, что наше исходное изображение имеет размер 1400 × 1200. Мы сохраним соотношение сторон 1,1667 с целевой областью 786432 пикселей².

Новые ширина и высота должны соответствовать этим двум условиям:
w / h = 1,667 (1-е условие, соотношение сторон)
и w * h = 786432 (2-е условие, площадь)
Здесь , w - ширина, h - высота.

Упрощение 2-го условия: h = 786432 / w.
Мы поместим значение h в 1-е уравнение: w / h = 1,667
w = 1,667 * h
w = 1,667 * (786432 / w)
w² = 1,667 * 786432
w = √ (1,667 * 786432) [вот оно]
w = 1144,981

Мы получили значение w. Если мы разделим целевую область на w, мы получим h. Итак, h = 786432 / w = 686,852.
Для простоты мы можем округлить числа до ближайшего целого числа, например w = 1145 и h = 687. Вот и все.

Подводя итоги: формула

Результирующие уравнения -

  • новая_ширина = квадратный_корень ((исходная_ширина / исходная_высота) × целевая_площадь)
  • new_height = target_area / new_width

Псевдокод -

Формула в действии

Проверьте некоторые изображения с измененным размером -

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

В любом случае спасибо.