iOS面试题--SDWebImage 是如何判断图片格式的原理
2020-12-30 本文已影响0人
CrazySnow
图片的格式
每一个图片格式都有对应的十六进制数据(PS:当然十六进制也是从二进制转换过来的),也可以说就是这些十六进制数据组成了一张图片,然后再通过计算机内部的渲染等一系列算法从而显示了一张图片,而往往前面的4~8个字节往往都代表了这张图片的格式
NSData+ImageContentType.h 的头文件夹下有这么一个方法
- (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
再来看看实现原理
+ (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;
}
uint8_t c;
[data getBytes:&c length:1];
这直接就截取了前1个字节长度的数据
再判断每个字节中的十六进制数所对应的格式
case 0x89: return SDImageFormatPNG;