最近在做东西的时候遇到了点问题,在加载图⽚的时候,加载失败,后缀都是jpg格式,但换个图⽚就可以了,为此,怀疑图⽚格式有问题,遂拖到UE⾥⾯查看它的16进制,果然,两个图⽚的⽂件头根本就不⼀样,这不是欺负⼈嘛,害我⽩⽩浪费了半天的时间,差点要重新编译内核。
然后到⽹上了⼀些资料,查看不同格式图⽚的⽂件头是怎样的。下⾯转帖是不同图⽚的⽂件头标志:
图⽚的格式很多,⼀个图⽚⽂件的后缀名并不能说明这个图⽚的真正格式什么,那么如何获取图⽚的格式呢?我想到了⼏个简单但有效的⽅法,那就是读取图⽚⽂件的⽂件头标识。我们知道各种格式的图⽚的⽂件头标识识不同的,因此我们可以通过判断⽂件头的标识来识别图⽚格式。
我对各种格式的图⽚⽂件头标识进⾏了分析,不仅查资料,也⽤⼗六进制编辑器察看过图⽚的⽂件头,以下是我收集、分析的结果,供⼤家参考。
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进制编辑器就可以看到了。
发布评论