根据图片头标识判断图片格式

今日名言

生命中最重要的是什么?我们真的要为了买间大房子,买台好车,买华美的家具,当季的衣服,提名牌包,吃大餐…而不断卖命工作吗?上班真的很辛苦,把40年最精华的青春岁月奉献给工作,用宝贵的人生去换回这些可能过几年就变成垃圾的物品,值得吗? ——《不上班也有钱》

前言

之前在做即时通讯的时候使用ndk编写了一个图片压缩库,在判断图片格式的时候卡了壳,本来打算用后缀名进行区分JPG和PNG或者BMP,后来发现pc端发来一个BMP的图片手动将后缀名改成了JPG,没办法,只好找更好的办法解决这个问题

解决

我们知道各种格式的图片的文件头标识识不同的,因此我们可以通过判断文件头的标识来识别图片格式。

我对各种格式的图片文件头标识进行了分析,不仅查找资料,也用十六进制编辑器察看过图片的文件头,以下是我收集、分析的结果,供大家参考。

  • 1.JPEG
    文件头标识 (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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章