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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
用nodejs实现PHP的print_r函数代码
Mar 14 NodeJs
NodeJS中Buffer模块详解
Jan 07 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
简单好用的nodejs 爬虫框架分享
Mar 26 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
使用python绘制二元函数图像的实例
2019/02/12 Python
python实现文件的备份流程详解
2019/06/18 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
双拥工作宣传标语
2014/06/26 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
2014年单位工作总结范文
2014/11/27 职场文书