Сокращение размеров картинки с сохранением пропорций

Вычислите общий коэффициент 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, ...) предотвращает нулевую сторону. Соотношение сторон сохраняется приблизительно с погрешностью пикселя; для экстремально вытянутых изображений нужно явно согласовать допустимое искажение.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее