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