Рассчитать соотношение изображения в JavaScript.Результат может быть приблизительным к спецификации - PullRequest
0 голосов
/ 20 июня 2019

Я хотел бы получить приблизительное указание соотношения изображения.Характеристики: 16/9 и 3/1;

Пример изображения, которое я проверю, имеет размеры 1281x720px;

Чтобы вычислить коэффициент, я использую этот код:

const gcd = (a, b) => b ? gcd(b, a % b): a;

const aspectRatio = (width, height)  => {
    const divisor = gcd(width, height);
    return `${width / divisor}:${height / divisor}`;
};

Этот код работает нормально.

Хорошо, есть ли возможность проверить, ближе ли изображение к 16/9 или к 3/1?Для меня достаточно приблизительного показания

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Это правильное соотношение, поэтому вы можете проверить, ближе ли ваша ширина / высота к 16/9 или 3/1:

const width = 1281
const height = 720

const distanceFrom16by9 = Math.abs(1281/720 - 16/9)
const distanceFrom3by1 = Math.abs(1281/720 - 3)

const ratio = distanceFrom16by9 < distanceFrom3by1 ? "16:9" : "3:1"

console.log(ratio)
0 голосов
/ 20 июня 2019

Может как то так?

const aspectRatio = (width, height)  => {
    const ratio = (width/height)-(16/9) < 0.1
                  ? '16:9'
                  : ((width/height)-(3/1) < 0.1 ? '3:1' : 'out of spec');

    return `${ratio}`;
};

console.log(aspectRatio(1281, 720));
console.log(aspectRatio(606, 202));
console.log(aspectRatio(320, 100));

обратите внимание, что выбранный «допуск» теперь произвольно равен 10%, чем больше размеры изображения, тем более неточным он становится (поскольку 10% будет большим диапазоном отклонения пикселей), поэтому вы можете рассмотреть возможность его уменьшения до Вам нравится ... приведенный выше код определенно не элегантен =), но для вашего конкретного сценария он должен работать.

Более "элегантным" и более гибким решением будет слегка расширенная версия вашей функции, примерно такая:

const aspectRatio = (width, height, tolerance = 0.1, specs = ['16:9', '3:1'])  => {
    return specs.filter((spec) => {
        if ( Math.abs((width/height)-eval(spec.replace(':', '/'))) <= tolerance ) {
            return spec;
        }
    })[0] || false;
};

console.log(aspectRatio(1281, 720));
console.log(aspectRatio(606, 202));
console.log(aspectRatio(320, 100));

это позволит указать

  • а) уровень допуска, на который размеры изображения могут отклоняться от «идеального соотношения»
  • б) допустимые значения коэффициента изображения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...