SDWebImage 判断图片类型
判断文件类型方法基本有两种:
- 通过文件后缀来判断 (简单,快捷 但是不准确,之前 公司android 客户端禁止用户上传 GIF , 前端默认可以播放 GIF ,有些不老实的用户,直接更改文件后缀,上传图片).
- 通过文件头来判断 (将整个文件读取到内存,判断文件类型没有必要) ,图片的格式存在 图片文件的前8个字节中.
下面看下 IOS 框架 SDWebImage 中判断图片格式.
+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {
if (!data) {
return SDImageFormatUndefined;
}
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return SDImageFormatJPEG;
case 0x89:
return SDImageFormatPNG;
case 0x47:
return SDImageFormatGIF;
case 0x49:
case 0x4D:
return SDImageFormatTIFF;
case 0x52:
// R as RIFF for WEBP
if (data.length < 12) {
return SDImageFormatUndefined;
}
NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
return SDImageFormatWebP;
}
}
return SDImageFormatUndefined;
}
很简单. 第一个字节 0xFF 则图片为 JPEG , 为 0x89 则为 PNG …
那么我们来验证下 SDWebImage 是否正确 .
1.Charles 抓包获取JPEG的图片 直接下方点击 hex .
第一列中的数字是文件偏移,从文件起始位置开始,至当前行第二列字节的偏移.(用十六进制表示).此外,每两位数表示一个字节.
可以看到以 ff 开头,没毛病 !
抓包看下 PNG图片
可以看到以 89 开头,没毛病 !
2.也可以通过 mac 十六进制编辑器查看文件的字节数据 : hexdump 命令 查看文件格式.
mac 命令行
hexdump /Users/lw/Desktop/wKgBOVnPvhKAYHo1AAOzga-Bneg230.png
看到这张 png 图片文件头第一个字节为 89 .