浅谈Node.js:Buffer模块(3)

这里我们只要用到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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwfpxj.html