nodejs下image-size统计图片的尺寸

由于iphone6和iphone6plus目前还能使用,有些客户抱怨说游戏会在Safari上重新加载,甚至不能使用,查了很多资料,发现出现这种情况是因为加载到内存的图片尺寸超了,所有图片尺寸面积和超过7千万或者8千万则会出现该问题。下面有统计图片尺寸的小工具。

电脑先安装nodejs,然后新建目录imagesize,在该目录下在命令行里npm init,一路回车,生成package.json,继续在命令行里npm i image-size,安装模块,新建imagesize.js,引入fs和image-size,完整代码如下


var fs = require('fs');
var imagesizeof = require('image-size');

//获取各个目录
var list = [];
var listimagesize = [];

//如果数字含有小数部分,那么可以将小数部分单独取出
//将小数部分的数字转换为字符串的方法:

var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];
var chnUnitSection = ["","万","亿","万亿","亿亿"];
var chnUnitChar = ["","十","百","千"];
// //输出    "一百二十三亿三千九百四十九万二千八百三十五点九九三零二"
var numToChn = function(num){
    var index =  num.toString().indexOf(".");
    if(index != -1){
        var str = num.toString().slice(index);
        var a = "点";
        for(var i=1;i<str.length;i++){
            a += chnNumChar[parseInt(str[i])];
        }
        return a ;
    }else{
        return ;
    }
}
//定义在每个小节的内部进行转化的方法,其他部分则与小节内部转化方法相同
function sectionToChinese(section){
    var str = '', chnstr = '',zero= false,count=0;   //zero为是否进行补零, 第一次进行取余由于为个位数,默认不补零
    while(section>0){
        var v = section % 10;  //对数字取余10,得到的数即为个位数
        if(v ==0){                    //如果数字为零,则对字符串进行补零
            if(zero){
                zero = false;        //如果遇到连续多次取余都是0,那么只需补一个零即可
                chnstr = chnNumChar[v] + chnstr;
            }
        }else{
            zero = true;           //第一次取余之后,如果再次取余为零,则需要补零
            str = chnNumChar[v];
            str += chnUnitChar[count];
            chnstr = str + chnstr;
        }
        count++;
        section = Math.floor(section/10);
    }
    return chnstr;
}
//定义整个数字全部转换的方法,需要依次对数字进行10000为单位的取余,然后分成小节,按小节计算,当每个小节的数不足1000时,则需要进行补零
function TransformToChinese(num){
    var a = numToChn(num);
    num = Math.floor(num);
    var unitPos = 0;
    var strIns = '', chnStr = '';
    var needZero = false;

    if(num === 0){
        return chnNumChar[0];
    }
    while(num > 0){
        var section = num % 10000;
        if(needZero){
            chnStr = chnNumChar[0] + chnStr;
        }
        strIns = sectionToChinese(section);
        strIns += (section !== 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
        chnStr = strIns + chnStr;
        needZero = (section < 1000) && (section > 0);
        num = Math.floor(num / 10000);
        unitPos++;
    }

    // return chnStr+a;
    return chnStr;
}
// TransformToChinese(12339492835.99302);

function getfoldername(path) {

    // var path = rootpath + gamename;
    // var path = rootpath + gamename;
    var isExists = fs.existsSync(path);
    if(!isExists) {
        console.log("异常情况,被终止------文件不存在:获取所有图片到数组",path);
        process.exit();
    }
    var files = fs.readdirSync(path);
    files.forEach(function (item, index) {
        var fPath = path + "/" + item;
        var stat = fs.statSync(fPath);
        if(stat.isDirectory() === true) {
            if(item.indexOf(".Dir") == -1){
                list.push(item);
            }
        }
    });
    for(var i = 0; i < list.length; i++){
        getfolderiamgesize(path,list[i])
    }
    totalallsize();
}

function getfolderiamgesize(_path,code) {

    var path = _path + "/" + code;
    var imagepngsizelist = [];
    var imagejpgsizelist = [];

    var files = fs.readdirSync(path);

    files.forEach(function (item, index) {
        var fPath = path + "/" + item;
        var stat = fs.statSync(fPath);

        var sub_str = fPath.substr(fPath.length - 4,fPath.length);
        var size;
        if (stat.isFile() === true) {
            //将所有的png,jpg,fnt
            if(sub_str == ".png"){
                size = imagesizeof(fPath);
                imagepngsizelist.push(size);
            }
            if(sub_str == ".jpg"){
                size = imagesizeof(fPath);
                imagejpgsizelist.push(size);
            }
        }
    });

    var allpngsize = 0;
    var alljpgsize = 0;
    for(var i = 0; i < imagepngsizelist.length; i++){
        allpngsize = allpngsize + imagepngsizelist[i].width * imagepngsizelist[i].height;
    }
    for(var i = 0; i < imagejpgsizelist.length; i++){
        alljpgsize = alljpgsize + imagejpgsizelist[i].width * imagejpgsizelist[i].height;
    }
    var pngsizezh = TransformToChinese(allpngsize);
    var jpgsizezh = TransformToChinese(alljpgsize);
    
    var allsize = allpngsize+alljpgsize;
    var allsizezh = TransformToChinese(allsize);
    var imagesize = {
        code:code,
        pngsize:allpngsize,
        pngsizezh:pngsizezh,
        jpgsize:alljpgsize,
        jpgsizezh:jpgsizezh,
        totalsize:allsize,
        totalsizezh:allsizezh
    }
    listimagesize.push(imagesize);
}

function totalallsize() {

    function compare(val1,val2) {
        return val1.totalsize - val2.totalsize;
    }
    listimagesize.sort(compare);
    for(var i = 0; i < listimagesize.length; i++){
        console.log("文件夹名",listimagesize[i].code);
        console.log("jpg大小",listimagesize[i].jpgsize);
        console.log("png大小",listimagesize[i].pngsize);
        console.log("合计大小",listimagesize[i].totalsize);
        console.log("jpg大小中文",listimagesize[i].jpgsizezh);
        console.log("png大小中文",listimagesize[i].pngsizezh);
        console.log("合计大小中文",listimagesize[i].totalsizezh);
        console.log("-----------序号" + i + "------------");
    }
    console.log("——————————————————排序后全部统计完成——————————————————");
}


getfoldername("./images");

在该js文件下有一个方法,getfoldername,传入需要统计的图片所在目录,运行后,在打印信息里会打印出来目录里图片的面积


版权声明:本文为liuchengshuang0307原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。