当前位置: 首页 > 后端技术 > Node.js

Node.JS识别图片类型

时间:2023-04-03 18:28:29 Node.js

Nodejs识别图片类型是通过切割文件名后缀得到的图片格式是不准确的,因为文件后缀可以强行更改,这样的.gif图片也可以保存为.gif图片。jpg,那么我们如何在Node上验证文件类型呢?通过文件头标识来判断图像格式其实很简单。每个图像文件都有一个文件头标识,各种格式的图像文件头标识是不同的。因此,可以通过判断文件头的标识来识别图像格式。通过在网上找资料,总结了以下几种图片文件头标识:1.JPEG/JPG——文件头标识(2字节):ff、d8文件尾标识(2字节):ff、d92.TGA——未压缩front5bytes0000020000-RLE压缩的前5个字节00001000003.PNG-文件头标识(8字节)89504E470D0A1A0A4.GIF-文件头标识(6字节)4749463839(37)615.BMP-文件头标识(2字节)424DBM6.PCX-文件头标识(1字节)0A7.TIFF-文件头标识(2字节)4D4D或49498.ICO-文件头标识(8字节)00000100010020209.CUR-文件头标识(8字节)000002000100202010.IFF-文件头标识(4字节)464F524D11.ANI-文件头标识(4字节)52494646知识点:1字节(bytes)=8位,以上数字均为十六进制,占用4位空间,每两个十六进制数占用一个字节如何判断通过比较带有标识符的图片资源二进制流,可以判断图片格式。因为实现逻辑很简单,具体实现逻辑看代码和注释,在此贡献出来供大家参考,方便大家开发使用。functiongetImageSuffix(fileBuffer){//将上述文件标识头按字节排列成数组constimageBufferHeaders=[{bufBegin:[0xff,0xd8],bufEnd:[0xff,0xd9],suffix:'.jpg'},{bufBegin:[0x00,0x00,0x02,0x00,0x00],后缀:'.tga'},{bufBegin:[0x00,0x00,0x10,0x00,0x00],后缀:'.rle'},{bufBegin:[0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a],后缀:'.png'},{bufBegin:[0x47,0x49,0x46,0x38,0x39,0x61],后缀:'.gif'},{bufBegin:[0x47,0x49,0x46,0x38,0x37,0x61],suffix:'.gif'},{bufBegin:[0x42,0x4d],suffix:'.bmp'},{bufBegin:[0x0a],后缀:'.pcx'},{bufBegin:[0x49,0x49],后缀:'.tif'},{bufBegin:[0x4d,0x4d],后缀:'.tif'},{bufBegin:[0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x20],后缀:'.ico'},{bufBegin:[0x00,0x00,0x02,0x00,0x01,0x00,0x20,0x20],后缀:'.cur'},{bufBegin:[0x46,0x4f,0x52,0x4d],后缀:'.iff'},{bufBegin:[0x52,0x49,0x46,0x46],suffix:'.ani'}]for(constimageBufferHeaderofimageBufferHeaders){letisEqual//确定标识头前缀if(imageBufferHeader.bufBegin){constbuf=Buffer.from(imageBufferHeader.bufBegin)isEqual=buf.equals(//使用buffer.slice方法以字节为单位切割缓冲区fileBuffer.slice(0,imageBufferHeader.bufBegin.length))}//确定后缀标识标头suffix}}//识别文件类型失败return''}这样我们就可以在Node中准确识别图片格式了文章很短,希望能帮到你~