使用node.js实现图片压缩

1 images模块介绍

处理图片往往会遇到图片压缩的问题,使用Windows系统自带的画图软件或者其它图像处理软件一般都能够实现图片的压缩,但是只能是单张处理,如果涉及到大批量的图片压缩的话,一张一张处理起来会相当麻烦。因此,可以考虑编写程序实现批量处理。node.js中提供了图片处理模块,比如gm、imagemin、images模块等。
本文中使用的是Node.js轻量级跨平台图像编解码库——images

1.1 安装

安装images模块

npm install images

1.2 API接口

images(file)  //从指定文件加载并解码图像

images(width, height)  //创建一个指定宽高的透明图像

images(buffer[, start[, end]])  //从Buffer数据中解码图像

images(image[, x, y, width, height])  //从另一个图像中复制区域来创建图像

.fill(red, green, blue[, alpha])
//eg:images(200, 100).fill(0xff, 0x00, 0x00, 0.5) Fill image with color
//以指定颜色填充图像

.draw(image, x, y)   //在当前图像( x , y )上绘制 image 图像

.encode(type[, config])
//eg:images("input.png").encode("jpg", {operation:50}) Encode image to buffer, config is image setting.
//以指定格式编码当前图像到Buffer,config为图片设置,目前支持设置JPG图像质量

Return buffer  //返回填充好的Buffer。注意:该操作将会切断调用链

.save(file[, type[, config]])
//eg:images("input.png").encode("output.jpg", {operation:50}) Encoding and save the current image to a file, if the type is not specified, type well be automatically determined according to the file, config is image setting. eg: { operation:50 }
//编码并保存当前图像到 file ,如果type未指定,则根据 file 自动判断文件类型,config为图片设置,目前支持设置JPG图像质量

.size([width[, height]])  //获取或者设置图像宽高,如果height未指定,则根据当前宽高等比缩放

.resize(width[, height])  //设置图像宽高,如果height未指定,则根据当前宽高等比缩放, 默认采用 bicubic 算法。

.width([width])  //获取或设置图像宽度

.height([height])  //获取或设置图像高度

images.setLimit(width, height)  //设置库处理图片的大小限制,设置后对所有新的操作生效(如果超限则抛出异常)

images.setGCThreshold(value)  //设置图像处理库自动gc的阈值(当新增内存使用超过该阈值时,执行垃圾回收)

images.getUsedMemory()   //得到图像处理库占用的内存大小(单位为字节)

images.gc()  //强制调用V8的垃圾回收机制

1.3 接口示例

node-images 提供了类似jQuery的链式调用API,可以像下面这样调用:

var images = require("images");

images("input.jpg")                     //Load image from file 
                                        //加载图像文件
    .size(400)                          //Geometric scaling the image to 400 pixels width
                                        //等比缩放图像到400像素宽
    .draw(images("logo.png"), 10, 10)   //Drawn logo at coordinates (10,10)
                                        //在(10,10)处绘制Logo
    .save("output.jpg", {               //Save the image to a file, with the quality of 50
        quality : 50                    //保存图片到文件,图片质量为50
    });

2 使用images模块实现图片批量压缩

要使用代码操作实现图片压缩处理,首先要明确思路:首先要有文件输入,然后处理,最后保存输出。而在node.js中就会涉及到文件系统(fs 模块)。在这里,我们只需要使用fs 模块获取到所有的目标图像的存放路径以及文件名,然后传递给images模块,在images模块中实现图像打开,压缩,保存的操作。具体代码如下所示:

var images = require("images");
var fs = require("fs");
var path = "test";
console.log(path);
function explorer(path){
    fs.readdir(path, function(err, files){
    //err 为错误 , files 文件名列表包含文件夹与文件
        if(err){
            console.log('error:\n' + err);
            return;
        }

        files.forEach(function(file){

            fs.stat(path + '/' + file, function(err, stat){
                if(err){console.log(err); return;}
                if(stat.isDirectory()){                 
                    // 如果是文件夹遍历
                    explorer(path + '/' + file);
                }else{
                    // 读出所有的文件
                    console.log('文件名:' + path + '/' + file);
                    var name = path + '/' + file;
                    var outName = path + '/' +'another_'+file

                    images(name)

                        .save(outName, {               //Save the image to a file,whih quality 50
                                quality : 60                    //保存图片到文件,图片质量为50
                            });

                }               
            });

        });

    });
}
explorer(path);

3 fs模块简要说明

上述案例中主要用到了fs模块中的fs.readdir()方法和fs.stat()方法。下面主要介绍一下这两种方法的使用:

3.1 读取目录fs.readdir()

用法fs.readdir(path, callback)
参数

  • path - 文件路径。
  • callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。

3.2 获取文件信息fs.stat()

用法fs.stat(path, callback)
参数

  • path - 文件路径。
  • callback - 回调函数,回调函数带有两个参数如:(err, stats), stats 是 fs.Stats 对象。
    fs.stat(path)执行后,会将stats类的实例返回给其回调函数。可以通过stats类中的提供方法判断文件的相关属性。例如判断是否为文件:
var fs = require('fs');

fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
    console.log(stats.isFile());         //true
})

stats类中的方法有:

方法 描述
stats.isFile() 如果是文件返回 true,否则返回 false。
stats.isDirectory() 如果是目录返回 true,否则返回 false。
stats.isBlockDevice() 如果是块设备返回 true,否则返回 false。
stats.isCharacterDevice() 如果是字符设备返回 true,否则返回 false。
stats.isSymbolicLink() 如果是软链接返回 true,否则返回 false。
stats.isFIFO() 如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
stats.isSocket() 如果是 Socket 返回 true,否则返回 false。

你可能感兴趣的:(使用node.js实现图片压缩)