今日名言
生命中最重要的是什么?我们真的要为了买间大房子,买台好车,买华美的家具,当季的衣服,提名牌包,吃大餐…而不断卖命工作吗?上班真的很辛苦,把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