今天发现获取图片的宽高,并不需要把图片完全读完之后再来获取,而只需要读取文件头文件,几十个字节便可以读出文件的宽高。
图片的文件头部存储有该图片相关信息,可以从中读取相应字段,得到尺寸、大小、格式等信息。由于无需载入整张图片,故而速度较快。当图片较大时,优势更加明显。
bmp(771*434):
可以看出width低位:0x12,高位:0x13。height低位:0x16,高位0x17。
PNG(906*440)
width低位:0x13,高位0x12。height低位:0x17,高位0x16。和bmp刚好相反
GIF(976*402)
width低位:0x07,高位0x06。height低位:0x09,高位0x08。
JPG(800*525)
width低位:0xA6,高位0xA5。height低位:0xA4,高位0xA3。
补充:以上4种图片类型的特征码
1.BMP
-文件头标识 (2 bytes) 42 4D
2.PNG
- 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A
3.GIF
- 文件头标识 (6 bytes) 47 49 46 38 39(37) 61
4.JPEG/JPG
- 文件头标识 (2 bytes): FF, D8 (SOI) (JPEG 文件标识)
- 文件结束标识 (2 bytes): FF, D9 (EOI)
jpg格式分析
偏移
长度
内容
块的名称
说明
0
2 byte
0xFFD8
(Start of Image,SOI)
图像开始
2
2 byte
0xFFE0
APP0(JFIF application segment)
JFIF应用数据块
4
2 bytes
length of APP0 block
APP0块的长度
6
5 bytes
"JFIF"+"0"
识别APP0标记
11
1 byte
<Major version>
主要版本号(如版本1.02中的1)
12
1 byte
<Minor version>
次要版本号(如版本1.02中的02)
13
1 byte
<Units for the X
and Y densities>
X和Y的密度单位
units=0:无单位
units=1:点数/英寸
units=2:点数/厘米
14
2 bytes
<Xdensity>
水平方向像素密度
16
2 bytes
<Ydensity>
垂直方向像素密度
18
1 byte
<Xthumbnail>
缩略图水平像素数目
19
1 byte
<Ythumbnail>
缩略图垂直像素数目
3n
< Thumbnail RGB bitmap>
缩略RGB位图(n为缩略图的像素数)
Optional JFIF extension APP0 marker segment(s)
任选的JFIF扩展APP0标记段
……
……
2 byte
0xFFD9
(EOI) end-of-file
图像文件结束标记