根據圖片頭標識判斷圖片格式

今日名言

生命中最重要的是什麼?我們真的要爲了買間大房子,買臺好車,買華美的傢俱,當季的衣服,提名牌包,喫大餐…而不斷賣命工作嗎?上班真的很辛苦,把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

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