Сделайте так:
- Рассчитать коэффициент масштабирования для ширины.
- Рассчитать масштабный коэффициент для высоты.
- Используйте наименьший коэффициент масштабирования для масштабирования ширины и высоты.
Пример кода:
void resize_coefs(const int original_w, const int original_h, int & new_w, int & new_h)
{
double scale = std::min(
((double) new_w) / original_w ,
((double) new_h) / original_h );
new_w = std::min( scale * original_w, new_w );
new_h = std::min( scale * original_h, new_h );
}
Из-за возможных ошибок округления рекомендуется проверить, что new_w
и new_h
все еще находятся в границах после масштабирования.
РЕДАКТИРОВАТЬ: Вот версия, которая делает то же самое только с целочисленной арифметикой, используя подсказку, предоставленную Керреком в своем ответе. Немного трудно понять, что он придерживается точно такой же логики.
void resize_coefs(const int original_w, const int original_h, int & new_w, int & new_h)
{
int num, den;
if (new_w * original_h < new_h * original_w) {
num = new_w;
den = original_w;
} else {
num = new_h;
den = original_h;
}
new_w = original_w * num / den;
new_h = original_h * num / den;
}