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
Nov 08 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
Nodejs--post的公式详解
Apr 29 NodeJs
配置nodejs环境的方法
May 13 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 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
phpfans留言版用到的install.php
2007/01/04 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
2016/05/17 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
Python内置函数的用法实例教程
2014/09/08 Python
跟老齐学Python之变量和参数
2014/10/10 Python
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
自考生毕业自我鉴定
2013/10/10 职场文书
机电专业个人求职信范文
2013/12/30 职场文书
肯尼迪就职演说稿
2013/12/31 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
安全宣传标语
2014/06/10 职场文书
节能减耗标语
2014/06/21 职场文书
离职感谢信
2015/01/21 职场文书
Python实现自动玩连连看的脚本分享
2022/04/04 Python
python双向链表实例详解
2022/05/25 Python