Saber 酱的抱枕

Fly me to the moon

01/25
2019
软件

使用 Node.js 按图片宽高比例筛选图片

最近我从 Pixiv 下载了 800 多张图片,想挑选一些适合做电脑壁纸的,这就要求图片是横图,不能是竖图。一张张删除太麻烦,我就去搜索有没有什么软件可以按图片的宽高比例来筛选图片,结果没找到合适的。

今天我去某个群里问,有人说你用 python 写个脚本吧。自学 py?听起来不错,但一说到脚本,我就想起了今年下半年……咳咳,想起了 Node.js,都是脚本嘛,都要加载模块,何必去学一门新语言,那样需要花的时间太多了。

图片存放在 D:\download\test 文件夹里(本例中不包含子文件夹)。

使用 Node.js 按图片宽高比例筛选图片

删除后效果:

使用 Node.js 按图片宽高比例筛选图片

操作步骤:

首先在终端里 cd 到 D:\download 文件夹,然后安装 image-size 包:

npm install image-size

这会在当前目录里保存这个模块,如果设置过 NODE_PATH 环境变量,也可以加上 -g 参数全局安装。

接下来编写一个 check.js,保存在 D:\download 里。内容如下:

var fs = require('fs');
var path = require('path');
var sizeOf = require('image-size');
var fileDirectory = path.resolve('D:\\download\\test');

if (fs.existsSync(fileDirectory)) { // 判断目录是否存在
	fs.readdir(fileDirectory, function (err, files) { // 获取文件列表
		if (err) {
			console.log(err);
			return;
		}
		// 循环文件
		files.forEach(function (filename) {
			var filepath = path.join(fileDirectory, filename); // 获取当前文件的绝对路径
			var dimensions = sizeOf(filepath); // 获取图片尺寸
			var width = dimensions.width;
			var height = dimensions.height;
			// console.log(width + ' x ' + height);
			if (width / height < 1.4) { // 16:9 的值是 1.78,值越小图片越竖,越大图片越扁
				fs.unlink(filepath, function (err) {
					if (err) {
						console.log(err);
						return;
					}
					console.log('del ' + filepath);
				});
			}
		});
	});
} else {
	console.log(fileDirectory + '  Not Found!');
}

最后运行之,等待运行完毕即可。速度很快。

使用 Node.js 按图片宽高比例筛选图片


关于比例问题:

16:9 的图片宽高比是 1.78,在此基础上,值越小图片越竖,越大图片越扁长。但有时候图片稍微竖一点也可以当壁纸的,所以我实验一番取了 1.4 这个比例。

使用 Node.js 按图片宽高比例筛选图片

    1. 猫猫虫
      Google Chrome 101Google Chrome 101WindowsWindows

      我下载image-size包后解压cd到解压目录内运行npm install image-size。
      然后运行筛选后显示下面的内容

      F:\test>node 000AAA.js
      D:\Softwares\nodejs\node_global\node_modules\image-size\dist\index.js:51
      throw new TypeError('unsupported file type: ' + type + ' (file: ' + filepath + ')');
      ^

      TypeError: unsupported file type: undefined (file: F:\test\000AAA-cmd-here.exe)
      at lookup (D:\Softwares\nodejs\node_global\node_modules\[4mimage-size[24m\dist\index.js:51:11)
      at imageSize (D:\Softwares\nodejs\node_global\node_modules\[4mimage-size[24m\dist\index.js:124:16)
      at F:\test\000AAA.js:15:30
      at Array.forEach ()
      at F:\test\000AAA.js:13:15
      [90m at FSReqCallback.oncomplete (node:fs:188:23)[39m

      F:\test>

      回复
        1. saber 文章作者
          Google Chrome 101Google Chrome 101WindowsWindows

          如果你换了文件夹,要记得修改 js 代码里的文件夹路径。
          另外运行脚本前需要确认安装了 nodejs 和 image-size。
          image-size 可以全局安装,也可以每次运行前看一下,当前文件夹里没有安装过 image-size 的话就安装一次。

          回复
          1. 猫猫虫
            Google Chrome 101Google Chrome 101WindowsWindows

            老哥可以给个联系方式嘛。。实在没辙了。我qq825973084

            js里的目录改了的
            也没报错说“没有image-size”。

            cmd窗口没任何反应像下面这样
            F:\>node 000aaa.js

            F:\>

            js的所有内容只改了目录和比例值
            var fs = require('fs');
            var path = require('path');
            var sizeOf = require('image-size');
            var fileDirectory = path.resolve('F:\\test');

            if (fs.existsSync(fileDirectory)) { // 判断目录是否存在
            fs.readdir(fileDirectory, function (err, files) { // 获取文件列表
            if (err) {
            console.log(err);
            return;
            }
            // 循环文件
            files.forEach(function (filename) {
            var filepath = path.join(fileDirectory, filename); // 获取当前文件的绝对路径
            var dimensions = sizeOf(filepath); // 获取图片尺寸
            var width = dimensions.width;
            var height = dimensions.height;
            // console.log(width + ' x ' + height);
            if (width / height < 0.5) { // 16:9 的值是 1.78,值越小图片越竖,越大图片越扁
            fs.unlink(filepath, function (err) {
            if (err) {
            console.log(err);
            return;
            }
            console.log('del ' + filepath);
            });
            }
            });
            });
            } else {
            console.log(fileDirectory + ' Not Found!');
            }

            回复