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使用jQuery选择器操作DOM
Feb 13 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 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中SESSION使用中的一点经验总结
2012/03/30 PHP
基于php无限分类的深入理解
2013/06/02 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
TensorFlow高效读取数据的方法示例
2018/02/06 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
生物化学研究助理员求职信
2013/10/09 职场文书
新学期教师寄语
2014/04/02 职场文书
个人收入证明范本
2014/09/18 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
用Python爬取某乎手机APP数据
2021/06/15 Python