Что алгоритм должен вычислить соотношение сторон?

Я планирую использовать его с JavaScript для обрезки изображения для установки всему окну.

Править: Я буду использовать сторонний компонент, который только принимает соотношение сторон в формате как: 4:3, 16:9.

74
задан akinuri 6 August 2019 в 07:28
поделиться

9 ответов

Я так понимаю, вы ищете подходящее решение для соотношения сторон целое: целое , например 16: 9 , а не с плавающей точкой: 1 решение, подобное 1.77778: 1 .

Если да, то вам нужно найти наибольший общий делитель (НОД) и разделить на него оба значения. НОД - это наибольшее число, которое равномерно делит оба числа. Итак, НОД для 6 и 10 равно 2, НОД для 44 и 99 - 11.

Например, для монитора с разрешением 1024x768 НОД составляет 256. Если вы разделите оба значения на это, вы получите 4x3 или 4: 3.

(рекурсивный) алгоритм GCD:

function gcd (a,b):
    if b == 0:
        return a
    return gcd (b, a mod b)

В C:

static int gcd (int a, int b) {
    return (b == 0) ? a : gcd (b, a%b);
}

int main(void) {
    printf ("gcd(1024,768) = %d\n",gcd(1024,768));
}

А вот полный HTML / Javascript, который показывает один из способов определения размера экрана и расчета на его основе соотношения сторон. Это работает в FF3, я не уверен, что другие браузеры поддерживают экран . width и screen.height .

<html><body>
    <script type="text/javascript">
        function gcd (a, b) {
            return (b == 0) ? a : gcd (b, a%b);
        }
        var w = screen.width;
        var h = screen.height;
        var r = gcd (w, h);
        document.write ("<pre>");
        document.write ("Dimensions = ", w, " x ", h, "<br>");
        document.write ("Gcd        = ", r, "<br>");
        document.write ("Aspect     = ", w/r, ":", h/r);
        document.write ("</pre>");
    </script>
</body></html>

Он выводит (на моем странном широкоэкранном мониторе):

Dimensions = 1680 x 1050
Gcd        = 210
Aspect     = 8:5

Другие, на которых я тестировал это:

Dimensions = 1280 x 1024
Gcd        = 256
Aspect     = 5:4

Dimensions = 1152 x 960
Gcd        = 192
Aspect     = 6:5

Dimensions = 1280 x 960
Gcd        = 320
Aspect     = 4:3

Dimensions = 1920 x 1080
Gcd        = 120
Aspect     = 16:9

Я бы хотел, чтобы у меня был последний дома, но, к сожалению, это рабочая машина.

Что вы будете делать, если обнаружите, что соотношение сторон не поддерживается вашим инструментом изменения размера графики, - другой вопрос. Я подозреваю, что лучше всего было бы добавить линии почтового бокса (например, те, которые вы получаете вверху и внизу вашего старого телевизора, когда вы смотрите на нем широкоэкранный фильм). Я бы добавил их сверху / снизу или по бокам (в зависимости от того, что дает наименьшее количество линий буквенного прямоугольника), пока изображение не будет соответствовать требованиям.

Одна вещь, которую вы можете захотеть рассмотреть, - это качество изображения это было изменено с 16: 9 на 5: 4 - я до сих пор помню невероятно высокий, худых ковбоев, которых я в юности наблюдал по телевизору до того, как появился почтовый бокс. Возможно, вам будет лучше иметь одно другое изображение для каждого соотношения сторон и просто изменить размер правильного в соответствии с фактическими размерами экрана, прежде чем отправлять его по сети.

182
ответ дан 24 November 2019 в 11:46
поделиться
Width / Height

?

-2
ответ дан 24 November 2019 в 11:46
поделиться

Я считаю, что соотношение сторон - это ширина, деленная на высоту.

 r = w/h
0
ответ дан 24 November 2019 в 11:46
поделиться

В качестве альтернативы поиску GCD я предлагаю вам проверить набор стандартных значений. Вы можете найти список в Википедии .

1
ответ дан 24 November 2019 в 11:46
поделиться

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

PAL DV имеет разрешение 720x576. Это выглядело бы как 4: 3. Теперь в зависимости от соотношения сторон пикселя (PAR) соотношение сторон экрана может быть 4: 3 или 16: 9.

Для получения дополнительной информации см. Здесь http://en.wikipedia.org/wiki/Pixel_aspect_ratio

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

Надеюсь, это поможет

Марк

1
ответ дан 24 November 2019 в 11:46
поделиться

Я думаю, что это делает то, о чем вы просите:

webdeveloper.com - десятичное в дробное

Ширина / высота дает вам десятичное число, преобразованное в дробь с ":" в место '/' дает вам "соотношение".

1
ответ дан 24 November 2019 в 11:46
поделиться

Думаю, вы хотите решить, какой из 4: 3 и 16: 9 подходит лучше всего.

function getAspectRatio(width, height) {
    var ratio = width / height;
    return ( Math.abs( ratio - 4 / 3 ) < Math.abs( ratio - 16 / 9 ) ) ? '4:3' : '16:9';
}
11
ответ дан 24 November 2019 в 11:46
поделиться
aspectRatio = width / height

, если это то, что вам нужно. Затем вы можете умножить его на одно из измерений целевого пространства, чтобы узнать другое (которое поддерживает соотношение) например,

widthT = heightT * aspectRatio
heightT = widthT / aspectRatio
42
ответ дан 24 November 2019 в 11:46
поделиться

Этот алгоритм в Python поможет вам частично решить эту проблему.


Скажите мне, что произойдет, если окна имеют забавный размер.

Может быть, вам нужно иметь список всех допустимых соотношений (к стороннему компоненту). Затем найдите ближайшее соответствие вашему окну и верните это соотношение из списка.

1
ответ дан 24 November 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: