这里我们只要用到PNG文件标识和PNG数据块的第一个块IHDR文件头数据块。文件标识是固定的8个字节,为89 50 4E 47 0D 0A 1A 0A,IHDR数据块的长度为13个字节,格式如下:
域的名称
字节数
说明
Width
4 bytes
宽度
Height
4 bytes
高度
Bit depth
1 bytes
图像深度
ColorType
1 bytes
颜色类型
Compression method
1 bytes
压缩方法
Filter method
1 bytes
滤波器方法
Interlace method
1 bytes
隔行扫描方法
开始编码,如下所示:
const fs = require('fs'); const path = require('path'); const argvs = process.argv.slice(2); if(argvs.length<=0){ console.error('请输入图片:png.js img1 img2 ...'); process.exit(-1); } argvs.forEach((img,idx,arr)=>{ var stat = fs.statSync(img); fs.open(img,'r',(err,fd)=>{ if(err) throw err; var buff = Buffer.alloc(stat.size); fs.read(fd,buff,0,stat.size,0,(err, bytesRead, buffer)=>{ if(err) throw err; fs.close(fd,()=>{}); getImgDimension(buff,(err,dimension)=>{ if(err) throw err; console.log(`${img}的尺寸为:${dimension.width}x${dimension.height}`); }); }); }); }); function getImgDimension(buff,cb){ if((buff.toString('utf8',1,8) === 'PNG\r\n\x1a\n') && (buff.toString('utf8',12,16) === 'IHDR')){ return cb(null,{ width:buff.readUInt32BE(16), height:buff.readUInt32BE(20) }),!0; }else{ return cb(new Error('不是PNG图片'),{}),!1; } }
执行结果如下:
E:\developmentdocument\nodejsdemo>node png.js 20160824083157.png 下载.png
20160824083157.png的尺寸为:195x195
下载.png的尺寸为:720x600