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中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
nodejs调用cmd命令实现复制目录
May 04 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 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
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
表单提交验证类
2006/07/14 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
python logging设置level失败的解决方法
2020/02/19 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
专科毕业生求职简历的自我评价
2013/10/12 职场文书
村干部培训方案
2014/05/02 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
公司总经理岗位职责
2015/04/01 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python