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的分辨率。
一般常见于:判断图片比例、视频比例、摄像头分辨率比例。