文档详情

JavaScript实现获取图片文件真实格式的示例代码.docx

发布:2025-05-17约4.09千字共6页下载文档
文本预览下载声明

JavaScript实现获取图片文件真实格式的示例代码

目录常见方式判断图片格式图像数据简单说明JS读取图片真实格式svg格式的判断总结前面博文有提到,当前主流浏览器能支持的图片格式,是七种:jpg、png、gif、bmp、ico、webp、svg,其中,前六种都是位图,svg则是唯一的矢量图。

每种格式的图片,都有自己特有的优缺点以及数据结构,本篇博文的目的就是基于不同格式的图像二进制数据,获取到图片的真实格式。

常见方式判断图片格式

当我们进行前端开发,需要处理图片上传功能,针对图片格式做判断时,常规的方法都是使用文件后缀名来判断,如下代码所示:

input.addEventListener(change,(e)={

constfile=e.target.files[0]

constformat=file.name.substring(file.name.lastIndexOf(.)+1).toLowerCase()

},false)

以上代码,监听上传控件的事件,得到要上传的文件信息,获取文件名称,然后通过获取文件名称截取文件后缀名,以后缀名作为图片文件的格式。

这段代码,大部分人都比较熟悉,也有很多场景下是这样来判断图片格式的,但如果我们强行修改了文件的后缀名,则此方法就失效了。

我们知道gif格式图片的位深度是8,如果我们强制把位深度为32的png格式的图片后缀名改成gif,这个图片文件依然可以正常使用:

上图所示,就是将png格式文件后缀名改成了gif,图片系统信息显示格式为gif,但是位深度还是32,图像本质上还是png格式的。

这个时候,单纯的通过后缀名来判断图片的格式,就不再准确了,我们需要另外的方式来获取图片文件的真实格式。而这种方式就需要使用到前端二进制相关的知识,见前文介绍深入理解前端字节二进制知识以及相关API。

修改后缀名的方式

几种位图格式之间,是可以相互修改后缀名,图片仍能正常使用gif动图后缀名改成其他位图格式,则动效会失效,变成静态图位图格式的后缀名如果改成矢量图svg,则图片失效,将无法使用svg图片文件后缀名改成位图格式,图片也将无法使用

图像数据简单说明

不同格式的图像所存储的数据是不一样的,都有自己特殊的数据结构。

依据各个格式图像不同的数据结构,我们通过类型数组中的图像数据,就能判断出图片的真实格式。

如jpg格式,它的图像数据结构中,最前面2个字节是一个固定取值0xFFD8,第三个字节一般也是固定0xFF。如png格式,它的图像数据结构中,最前面8个字节就是PNG文件署名域,可以很好的标识出当前图像的格式就是PNG。如bmp格式,它的图像数据结构中,最前面14个字节存储的是文件头信息,而最前面2个字节存储的就是文件类型:BM。如webp格式,需要从最前面移动8个字节以后,取接下来的4个字节的信息,代表文件类型:WEBP

针对不同位图的的数据判断,可以使用下面表格列出的方式:

格式标识的字节数对应的十进制值偏移量jpg32552162550png8137807871131026100gif371,73,700webp487,69,66,808ico40,0,1,00bmp266770

其中,偏移量为0,表示取最前面几个字节的数据;webp的偏移量为8,表示从最前面移动8个字节后,再取4个字节的标识符。

上面的表格,已经列出了当前浏览器支持的位图图像,字节判断标识,通过读取相应的数据做对比就得到了真实的格式。

以上几种格式中,bmp、gif、webp取到的数据,都能对应各自特有的署名标识,前面有提到BM和WEBP,gif格式的则是GIF。可以运用字符编码方面的知识,如使用String.fromCharCode方法对数值进行转换,具体的前端字符编码知识见前文前端开发中需要搞懂的字符编码

//bmp

String.fromCharCode(66)//B

String.fromCharCode(77)//M

//gif

String.fromCharCode(71)//G

String.fromCharCode(73)//I

String.fromCharCode(70)//F

//webp

String.fromCharCode(87)//W

String.fromCharCode(69)//E

String.fromCharCode(66)//B

String.fromCharCode(80)//P

显示全部
相似文档