jpg/jpeg图片优化之jpegoptim

一、前话

对于图片优化,可能很多人都有这个想法,但是真正用于实践的人真的不多。

在chrome下使用pagespeed可以很清楚的看到在中优先级里,有一个项名为:优化图片,说的就是图片优化的事。里面列出网站所有可以压缩的图片。

基于对google的信任和崇拜,自然要弄明白用的是什么工具,然后查了一下官方文档,说是对于jpg/jpeg文件推荐使用jpegoptim进行压缩,但是没有说怎么去使用参数。这样就出现了本文。

二、jpegoptim使用

在网上找到了一篇文章:jpegoptim 优化 jpeg 图片,里面提供的一个方法是:jpegoptim –strip-com –strip-exif –strip-iptc -m85 ./IMG_4542.jpg

基于这些隔参数写了一个基于nodejs的压缩jpg脚本:

大致思路:

  1. 获取到对于的源文件,执行jpegoptim。
  2. 循环遍历文件里不是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

你可能感兴趣的:(jpegoptim)