Nodejs 识别图片类型的方法
通过切文件名称后缀来获得图片格式的方式是不准确的,因为文件后缀是可以被强行更改的,这样一个.gif图片也可以被保存成.jpg,
那么在Node上我们如何做文件类型的校验呢
通过文件头标识判断图片格式
其实很简单,每个图片文件都有文件头标识,各种格式的图片的文件头标识都是不一样,所以可以通过判断文件头的标识来识别图片格式。
通过在网上找资料,汇总了如下的图片文件头标识:
1.JPEG/JPG-文件头标识(2bytes):ff,d8文件结束标识(2bytes):ff,d9 2.TGA-未压缩的前5字节0000020000-RLE压缩的前5字节0000100000 3.PNG-文件头标识(8bytes)89504E470D0A1A0A 4.GIF-文件头标识(6bytes)4749463839(37)61 5.BMP-文件头标识(2bytes)424DBM 6.PCX-文件头标识(1bytes)0A 7.TIFF-文件头标识(2bytes)4D4D或4949 8.ICO-文件头标识(8bytes)0000010001002020 9.CUR-文件头标识(8bytes)0000020001002020 10.IFF-文件头标识(4bytes)464F524D 11.ANI-文件头标识(4bytes)52494646
知识点:1字节(bytes)=8bits,上面的数字均为16进制也就占4bits空间,每两个16进制数字占一字节
如何判断
通过将图片资源的二进制流与该标识做比对,即可判断图片格式。
因为实现逻辑非常简单,具体的实现逻辑看代码和注释就就好,在这里贡献出来给大家参考,方便大家开发使用。
functiongetImageSuffix(fileBuffer){ //将上文提到的文件标识头按字节整理到数组中 constimageBufferHeaders=[ {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(constimageBufferHeaderofimageBufferHeaders){ letisEqual //判断标识头前缀 if(imageBufferHeader.bufBegin){ constbuf=Buffer.from(imageBufferHeader.bufBegin) isEqual=buf.equals( //使用buffer.slice方法对buffer以字节为单位切割 fileBuffer.slice(0,imageBufferHeader.bufBegin.length) ) } //判断标识头后缀 if(isEqual&&imageBufferHeader.bufEnd){ constbuf=Buffer.from(imageBufferHeader.bufEnd) isEqual=buf.equals(fileBuffer.slice(-imageBufferHeader.bufEnd.length)) } if(isEqual){ returnimageBufferHeader.suffix } } //未能识别到该文件类型 return'' }
通过这种方式我们就能在Node中准确地识别图片格式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。