Составьте список соотношений, включающих значения (10000/1, 5000/2, etc)
[10000, 2500, 625, 400, 156.25, 100, 39.065, 25, 16, 6.25, 4, 1.5625, 1...0.0001]
или готовые к использованию кортежи с соотношением, шириной и высотой:
[(10000, 10000, 1), (2500, 5000, 2), (625, 2500, 4) ...]
и инверсиями первой частиэтого списка.
Для заданного отношения w / h найдите ближайшее значение из списка и используйте соответствующие ширину и высоту, чтобы получить результирующий прямоугольник.
Например, у вас есть 300x200
изображение ссоотношение 1.5
.Наилучшее значение - 1.5625
, поэтому прямоугольник результата равен 125x80
, а масштабные коэффициенты 125/300
и 80/200
l = []
for i in range(1, 10001):
if (10000 % i == 0):
w = i
h = 10000 // i
r = w / h
l.append((r, w, h))
ww, hh = 1920, 1080
rr = ww / hh
mn = 100000
for i in range(len(l)):
cmn = max(rr / l[i][0], l[i][0] / rr)
if (cmn < mn):
bestidx = i
mn = cmn
new_width = l[bestidx][1]
new_height = l[bestidx][2]