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整合银联网关支付(DEMO)
Nov 09 NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 NodeJs
配置nodejs环境的方法
May 13 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
Nodejs异步流程框架async的方法
Jun 07 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 NodeJs
详解NodeJS模块化
Jun 15 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启动时候提示PHP startup的解决方法
2013/05/07 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
详解Django通用视图中的函数包装
2015/07/21 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
中专自荐信
2013/10/13 职场文书
内衣营销方案
2014/03/15 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
人才市场接收函
2015/01/30 职场文书
鲁冰花观后感
2015/06/10 职场文书
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers