zoukankan      html  css  js  c++  java
  • 通过文件头标识判断图片格式(转)

    转自:http://zjf30366.blog.163.com/blog/static/41116458201042194542973/

    图片的格式很多,一个图片文件的后缀名并不能说明这个图片的真正格式什么,那么如何获取图片的格式呢?我想到了几个简单但有效的方法,那就是读取图片文件的文件头标识。我们知道各种格式的图片的文件头标识识不同的,因此我们可以通过判断文件头的标识来识别图片格式。

    1.JPEG/JPG
    - 文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识) 
    - 文件结束标识 (2 bytes): $ff, $d9 (EOI) 

    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
                            G  I  F  8  9 (7)  a

    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
                            F  O  R  M

    11.ANI
    - 文件头标识 (4 bytes)   52 49 46 46
                            R  I  F  F

         根据这些文件头标识的收集,我可以写一个识别图像格式的模块了。但是在写这个模块之前可以对收集到的文件头标识进行优化,使得程序中字符串比对次数尽量的少。
    1.JPEG我们知需要比对文件头的$ff, $d8这两个字符,而不用读取最后的两个结束标识了。
    2.TGA,ICO,CUR只需比对第三个与第五个字符即可。
    3.PNG比对[89][50]这两个字符。
    4.GIF比对[47][49][46]与第五个字符。

    废话不多说了,利用内存流来判断文件的格式,其实判断文件的前几个字节就可以简单的判断这个文件是什么类型的文件,例如

    jpg文件 是 FFD8 (从低位到高位就要反过来 D8FF 下面都是一样)

    BMP文件 是 424D ---4D42

    其他的我就不一一列举了,想知道跟多文件类型分别是用什么字符作为文件的开头的话,下载个C32asm或者UE等这类16进制编辑器就可以看到了。

  • 相关阅读:
    Win7系统安装Centos7.0双系统(二)
    vue动态加载图片失效
    vuex store更新了数据,但未触发getters
    js获取图片信息
    http请求204
    IOS 伪类:active失效
    js下载blob的形式
    URL的 ? 和 # (hash),如何将参数保存在URL中,用于刷新获取之前的变量?
    vue中修改数组,dom未更新的问题
    vue中使用qrcode,遇到两次渲染的问题
  • 原文地址:https://www.cnblogs.com/asderx/p/4874626.html
Copyright © 2011-2022 走看看