Вычислите общий коэффициент min(1, 800/width, 600/height) и умножьте на него обе стороны. Для целых пикселей требуется округление, поэтому точное сохранение любого соотношения не всегда возможно.
Сокращение размеров картинки с сохранением пропорций
Вычислите общий коэффициент min(1, 800/width, 600/height) и умножьте на него обе стороны. Для целых пикселей требуется округление, поэтому точное сохранение любого соотношения не всегда возможно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию resize, которая получает текущие ширину и высоту изображения и возвращает их новые значения, уменьшенные пропорционально, так чтобы:
- ширина не превышала 800 пикселей;
- высота не превышала 600 пикселей;
- исходные пропорции изображения сохранялись.
from typing import Final, Tuple
MAX_W: Final[int] = 800
MAX_H: Final[int] = 600
def resize(width: int, height: int) -> Tuple[int, int]:
pass
Ответ
Вычислите общий коэффициент min(1, 800/width, 600/height) и умножьте на него обе стороны. Для целых пикселей требуется округление, поэтому точное сохранение любого соотношения не всегда возможно.
Практический вариант, который не увеличивает изображение:
def resize(width: int, height: int) -> tuple[int, int]:
if width <= 0 or height <= 0:
raise ValueError('Dimensions must be positive')
scale = min(1, 800 / width, 600 / height)
return max(1, int(width * scale)), max(1, int(height * scale))
Для 1600×900 получится 800×450; 400×300 останется без изменений. Округление вниз удерживает размеры в рамках, а max(1, ...) предотвращает нулевую сторону. Соотношение сторон сохраняется приблизительно с погрешностью пикселя; для экстремально вытянутых изображений нужно явно согласовать допустимое искажение.