java应用16进制来辨别png格局的图片

2020-03-31 01:20

  很多人知道应用.png的字符串开头可以辨别前端传入的图片可否为png格局,然则这只是潜看法的辨别!那么若何应用png读写的特别内容来深看法地辨别图片格局呢?比来在做器械的时分碰到了点后果,在加载图片的时分,加载掉败,后缀都是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]与第五个字符。

分享到:
收藏