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写的一个简单项目打包工具
May 11 NodeJs
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
修改Nodejs内置的npm默认配置路径方法
May 13 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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
基于mysql的bbs设计(四)
2006/10/09 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
学习YUI.Ext第五日--做拖放Darg&Drop
2007/03/10 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
Angular17之Angular自定义指令详解
2018/01/21 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
Python的类实例属性访问规则探讨
2015/01/30 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
python实现字符串和字典的转换
2018/09/29 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
几道PHP的面试题
2012/05/19 面试题
保险公司年会主持词
2014/03/22 职场文书
树转促学习心得体会
2014/09/10 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
工作自我推荐信范文
2015/03/25 职场文书
详解MySQL集群搭建
2021/05/26 MySQL
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python