一、前话
对于图片优化,可能很多人都有这个想法,但是真正用于实践的人真的不多。
在chrome下使用pagespeed可以很清楚的看到在中优先级里,有一个项名为:优化图片,说的就是图片优化的事。里面列出网站所有可以压缩的图片。
基于对google的信任和崇拜,自然要弄明白用的是什么工具,然后查了一下官方文档,说是对于jpg/jpeg文件推荐使用jpegoptim进行压缩,但是没有说怎么去使用参数。这样就出现了本文。
二、jpegoptim使用
在网上找到了一篇文章:jpegoptim 优化 jpeg 图片,里面提供的一个方法是:jpegoptim –strip-com –strip-exif –strip-iptc -m85 ./IMG_4542.jpg
基于这些隔参数写了一个基于nodejs的压缩jpg脚本:
大致思路:
- 获取到对于的源文件,执行jpegoptim。
- 循环遍历文件里不是jpg/jpeg文件,判断是否是文件目录,是的话执行第一步
具体源码:
/** * jpg图片优化 * 使用:node jpg.js sourceDirname receiveDirname * 采用了jpepoptim工具 * */ var path = require('path'), fs = require('fs'), child_process = require('child_process'), exec = child_process.exec, tplCommand = 'jpegoptim --dest={r} -f -m85 --strip-com --strip-exif --strip-iptc {s}', sourceDir = process.argv[2] && path.resolve(process.argv[2]), receiveDir = process.argv[3] && path.resolve(process.argv[3]), jpgReg = /\.(jpg|jpeg)$/; console.log(sourceDir, receiveDir); if (!isDirectory(sourceDir)) { console.log('source dirname is require.'); process.exit(1); } // 判断是否有receive文件目录,没有在sourceDir的路径创建一个**_optimize目录 if (!receiveDir) { receiveDir = sourceDir + '_optimize'; console.log('Need add receiveDir:', receiveDir); if (!isDirectory(receiveDir)) { fs.mkdirSync(receiveDir); } } // 判断是否存在给定文件地址,没有则创建它 if (!isDirectory(receiveDir)) { console.log('mkdir:', receiveDir); fs.mkdirSync(receiveDir); } console.log('sourceDir:', sourceDir, ' receiveDir: ', receiveDir); /** * @description: 优化处理函数 * @param: dirname 文件目录的绝对路径,如:/home/ys/project/ * @param: pathname 文件相对于要压缩的目录的路径,如:pic/ */ function optimize(dirname, pathname) { fs.readdir(dirname, function(err, files) { if (err) { console.log('Readdir:', dirname, err); process.exit(1); } else { console.log(files); var l = files.length, filepath; // 空文件情况 if (l > 0) { compressJpeg(dirname, pathname); while(l--) { if (!jpgReg.test(files[l])) { filepath = path.resolve(dirname, files[l]); if (isDirectory(filepath)) { optimize(filepath, files[l]); } else { console.log('No such dirname:', filepath); } } } } } }); } /** * @description:压缩目录下所有的jpg,jpeg文件 * @param: dirname 文件目录的绝对路径,如:/home/ys/project/ * @param: pathname 文件相对于要压缩的目录的路径,如:pic/ */ function compressJpeg(dirname, pathname) { var receive = path.resolve(receiveDir, pathname); if (path !== '') { if (!isDirectory(receive)) { fs.mkdirSync(receive); } } var data = { s : path.resolve(dirname, '*'), r : receive }, command = tplCommand.replace(/{(\w+)}/g, function($0, $1) { return data[$1]; }); console.log(command) exec(command, function(err, stdout) { if (err) { console.log("Exec err: ", err); // process.exit(1); } console.log('optimize folder:', stdout); }); } /** * @description: 是否是一个文件目录 * @param: path 文件目录 */ function isDirectory(path) { if (fs.existsSync(path)) { return fs.statSync(path).isDirectory(); } return false; } optimize(sourceDir, ''); 转载自: http://www.bokeyy.com/post/jpgjpeg%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96%E4%B9%8Bjpegoptim.html