js判断宽高比16比9的比例,4比3,Math.abs()绝对值的应用

写个js函数,判断图片、视频宽高比是不是16比9,入参是分辨率的字符串

判断宽高比例 16比9 函数示例 代码参考

function is16by9(resolution) {
    // 分割字符串,提取宽度和高度
    const [width, height] = resolution.split('x').map(Number);

    // 计算宽高比
    const ratio = width / height;

    // 判断是否为16:9
    // return ratio === 16 / 9;
    return Math.abs(ratio - 16 / 9) <= 0.01;
}
// 测试一下
console.log(is16by9('1920x1080')) // true

为什么用 Math.abs() 求绝对值函数呢?

在计算16比9画面的时候,真实的分辨率,宽除以高,不一定完全等于 16/9=1.7777777777777777 这个值。

实际上,我们有些视频的分辨率,宽除以高,就是 1.78 左右,有的是1.76左右。

因为,我们判断比例的时候,要允许一点点误差,这时候, Math.abs() 就有应用场景了。

宽高比,比1.7777大一点点,也能算作 16比9,但是不能大太多。

宽高比,比1.7777小一点点,也能算作 16比9,不要小太多就行了。

而Math.abs(x)刚刚好,做绝对值计算,如果 x 是负数(包括 -0),则返回 -x。否则,返回 x。

刚好能满足,比1.777大一点点、小一点点的判断。


为什么不直接使用 === 等于判断呢?

因为js会遇到小数点精度的问题,有时候会出现 0.1+0.2= 0.30000000000000004 的问题。

为了避免这类问题,所以不使用 === 等于判断。

详细实践代码

判断16比9、4比3、8比5、5比4的比例的代码都有。

    var list = `
    720x576
    640x360
    640x480
    720x576
    768x576
    800x600
    856x480
    960x540
    1024x576
    1024x768
    1280x1024
    1600x1200
    1280x800
    1280x960
    1280x720
    1368x680
    1440x900
    1440x1080
    1680x1050
    1920x1200
    1920x1080
    `
    var list = list.split("\n").filter(it => it)
    console.log(list.filter(is16by9));
    /* [
      "640x360",
      "960x540",
      "1024x576",
      "1280x720",
      "1920x1080"
    ] */
    console.log(list.filter(is5by4));
    /* [
      "720x576",
      "720x576",
      "1280x1024"
    ] */
    console.log(list.filter(is4by3));
    /* [
      "640x480",
      "768x576",
      "800x600",
      "1024x768",
      "1600x1200",
      "1280x960",
      "1440x1080"
    ] */
    console.log(list.filter(is8by5));
    /* [
      "1280x800",
      "1440x900",
      "1680x1050",
      "1920x1200"
    ] */
    
    function is16by9(resolution) {
        // 分割字符串,提取宽度和高度
        const [width, height] = resolution.split('x').map(Number);
    
        // 计算宽高比
        const ratio = width / height;
    
        // 判断是否为16:9
        // return ratio === 16 / 9;
        return Math.abs(ratio - 16 / 9) <= 0.001;
    }
    // 测试函数
    const resolution = "1920x1080";
    console.log(is16by9(resolution)); // 输出: true

    function is5by4(resolution) {
        // 分割字符串,提取宽度和高度
        const [width, height] = resolution.split('x').map(Number);
    
        // 计算宽高比
        const ratio = width / height;
        return Math.abs(ratio - 5 / 4) <= 0.001;
    }
    function is4by3(resolution) {
        // 分割字符串,提取宽度和高度
        const [width, height] = resolution.split('x').map(Number);
    
        // 计算宽高比
        const ratio = width / height;
        return Math.abs(ratio - 4 / 3) <= 0.001;
    }
    function is8by5(resolution) {
        // 分割字符串,提取宽度和高度
        const [width, height] = resolution.split('x').map(Number);
    
        // 计算宽高比
        const ratio = width / height;
        return Math.abs(ratio - 8 / 5) <= 0.001;
    }

以上代码,实现了:在一个数组的各种分辨率中,筛选出 16比9的分辨率、4比3的分辨率、5比4的分辨率、8比5的分辨率。

一般常见于:判断图片比例、视频比例、摄像头分辨率比例。