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 Express框架中处理404页面一个方式
May 28 NodeJs
NodeJS学习笔记之网络编程
Aug 03 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
配置nodejs环境的方法
May 13 NodeJs
详解nodejs异步I/O和事件循环
Jun 07 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
nodejs制作小爬虫功能示例
Feb 24 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递归实现汉诺塔问题的方法示例
2017/11/25 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
datagrid框架的删除添加与修改
2013/04/08 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
python threading模块操作多线程介绍
2015/04/08 Python
举例讲解Python中的算数运算符的用法
2015/05/13 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
20招让你的Python飞起来!
2016/09/27 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
Python数据处理numpy.median的实例讲解
2018/04/02 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
Python random模块的使用示例
2020/10/10 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
升职自荐信范文
2013/10/05 职场文书
顶撞领导检讨书
2014/01/29 职场文书
村委会换届选举方案
2014/05/03 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
python基于turtle绘制几何图形
2021/06/15 Python
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android