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 后缀名判断限制代码
Mar 31 NodeJs
利用NodeJS的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
nodejs分页类代码分享
Jun 17 NodeJs
Nodejs极简入门教程(三):进程
Oct 27 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
让nodeJS支持ES6的词法----babel的安装和使用方法
Jul 31 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 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调用数据库的存贮过程!
2006/10/09 PHP
PHP 进程锁定问题分析研究
2009/11/24 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
python编写的最短路径算法
2015/03/25 Python
Python中for循环控制语句用法实例
2015/06/02 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
python跨文件使用全局变量的实现
2020/11/17 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
教师三严三实学习心得体会
2014/10/11 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
安全保证书怎么写
2015/02/28 职场文书
爱心募捐通知范文
2015/04/27 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
Golang数据类型和相互转换
2022/04/12 Golang