圖片的格式
每一個圖片格式都有對應(yīng)的十六進制數(shù)據(jù)(PS:當然十六進制也是從二進制轉(zhuǎn)換過來的),也可以說就是這些十六進制數(shù)據(jù)組成了一張圖片,然后再通過計算機內(nèi)部的渲染等一系列算法從而顯示了一張圖片,而往往前面的4~8個字節(jié)往往都代表了這張圖片的格式
NSData+ImageContentType.h 的頭文件夾下有這么一個方法
- (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
再來看看實現(xiàn)原理
+ (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個字節(jié)長度的數(shù)據(jù)
再判斷每個字節(jié)中的十六進制數(shù)所對應(yīng)的格式
case 0x89: return SDImageFormatPNG;