Nodejs 识别图片类型的方法


Posted in NodeJs onAugust 15, 2019

通过切文件名称后缀来获得图片格式的方式是不准确的,因为文件后缀是可以被强行更改的,这样一个.gif 图片也可以被保存成.jpg,

那么在 Node 上我们如何做文件类型的校验呢

通过文件头标识判断图片格式

其实很简单,每个图片文件都有文件头标识,各种格式的图片的文件头标识都是不一样,所以可以通过判断文件头的标识来识别图片格式。

通过在网上找资料,汇总了如下的 图片文件头标识:

1.JPEG/JPG - 文件头标识 (2 bytes): ff, d8 文件结束标识 (2 bytes): ff, d9
2.TGA - 未压缩的前 5 字节 00 00 02 00 00 - RLE 压缩的前 5 字节 00 00 10 00 00
3.PNG - 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A
4.GIF - 文件头标识 (6 bytes) 47 49 46 38 39(37) 61
5.BMP - 文件头标识 (2 bytes) 42 4D B M
6.PCX - 文件头标识 (1 bytes) 0A
7.TIFF - 文件头标识 (2 bytes) 4D 4D 或 49 49
8.ICO - 文件头标识 (8 bytes) 00 00 01 00 01 00 20 20
9.CUR - 文件头标识 (8 bytes) 00 00 02 00 01 00 20 20
10.IFF - 文件头标识 (4 bytes) 46 4F 52 4D
11.ANI - 文件头标识 (4 bytes) 52 49 46 46

知识点: 1 字节(bytes) = 8 bits,上面的数字均为 16 进制也就占 4bits 空间,每两个 16 进制数字占一字节

如何判断

通过将图片资源的二进制流与该标识做比对,即可判断图片格式。

因为实现逻辑非常简单,具体的实现逻辑看代码和注释就就好,在这里贡献出来给大家参考,方便大家开发使用。

function getImageSuffix(fileBuffer) {
 // 将上文提到的 文件标识头 按 字节 整理到数组中
 const imageBufferHeaders = [
  { bufBegin: [0xff, 0xd8], bufEnd: [0xff, 0xd9], suffix: '.jpg' },
  { bufBegin: [0x00, 0x00, 0x02, 0x00, 0x00], suffix: '.tga' },
  { bufBegin: [0x00, 0x00, 0x10, 0x00, 0x00], suffix: '.rle' },
  {
   bufBegin: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],
   suffix: '.png'
  },
  { bufBegin: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61], suffix: '.gif' },
  { bufBegin: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61], suffix: '.gif' },
  { bufBegin: [0x42, 0x4d], suffix: '.bmp' },
  { bufBegin: [0x0a], suffix: '.pcx' },
  { bufBegin: [0x49, 0x49], suffix: '.tif' },
  { bufBegin: [0x4d, 0x4d], suffix: '.tif' },
  {
   bufBegin: [0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20],
   suffix: '.ico'
  },
  {
   bufBegin: [0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x20, 0x20],
   suffix: '.cur'
  },
  { bufBegin: [0x46, 0x4f, 0x52, 0x4d], suffix: '.iff' },
  { bufBegin: [0x52, 0x49, 0x46, 0x46], suffix: '.ani' }
 ]
 for (const imageBufferHeader of imageBufferHeaders) {
  let isEqual
  // 判断标识头前缀
  if (imageBufferHeader.bufBegin) {
   const buf = Buffer.from(imageBufferHeader.bufBegin)
   isEqual = buf.equals(
    //使用 buffer.slice 方法 对 buffer 以字节为单位切割
    fileBuffer.slice(0, imageBufferHeader.bufBegin.length)
   )
  }
  // 判断标识头后缀
  if (isEqual && imageBufferHeader.bufEnd) {
   const buf = Buffer.from(imageBufferHeader.bufEnd)
   isEqual = buf.equals(fileBuffer.slice(-imageBufferHeader.bufEnd.length))
  }
  if (isEqual) {
   return imageBufferHeader.suffix
  }
 }
 // 未能识别到该文件类型
 return ''
}

通过这种方式我们就能在Node中准确地识别图片格式。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 #NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 #NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 #NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 #NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 #NodeJs
关于NodeJS中的循环引用详解
Jul 23 #NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 #NodeJs
You might like
帅气的琦玉老师
2020/03/02 日漫
德生S2000电路分析
2021/03/02 无线电
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
对xmlHttp对象的理解
2011/01/17 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
js日历功能对象
2012/01/12 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
Python中进程和线程的区别详解
2017/10/29 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
浅析PEP572: 海象运算符
2019/10/15 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
法学专业个人求职信
2013/09/26 职场文书
文史专业毕业生自荐信
2013/11/17 职场文书
法人委托书
2014/07/31 职场文书
校本课程教学计划
2015/01/19 职场文书
可可西里观后感
2015/06/08 职场文书
葬礼主持词
2015/07/02 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
python运行脚本文件的三种方法实例
2022/06/25 Python
Redis+AOP+自定义注解实现限流
2022/06/28 Redis