首先我們先想想如果是你, 你會怎么去判斷一個從網(wǎng)絡(luò)獲取的圖片URL是否為gif圖片, 是否是這樣呢 ? 如下:
NSString *path = @"http://pic3.nipic.com/20090709/2893198_075124038_2.gif";//假設(shè)這是一個網(wǎng)絡(luò)獲取的URL
NSString *extensionName = path.pathExtension;// 判斷是否為gif
if ([extensionName.lowercaseString isEqualToString:@"gif"]) {
//是gif圖片
} else {
//不是gif圖片
}
以上判斷看似是可以的,但是這不嚴謹?shù)? 在不知道圖片擴展名的情況下, 如何知道圖片的真實類型 ? 其實就是取出圖片數(shù)據(jù)的第一個字節(jié), 就可以判斷出圖片的真實類型那該怎么做呢如下:
//通過圖片Data數(shù)據(jù)第一個字節(jié) 來獲取圖片擴展名
- (NSString *)contentTypeForImageData:(NSData *)data{
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"jpeg";
case 0x89:
return @"png";
case 0x47:
return @"gif";
case 0x49:
case 0x4D:
return @"tiff";
case 0x52:
if ([data length] < 12) {
return nil;
}
NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
return @"webp";
}
return nil;
}
return nil;
}
其實圖片數(shù)據(jù)的第一個字節(jié)是固定的,一種類型的圖片第一個字節(jié)就是它的標識, 我們來調(diào)用一下這個方法:
//假設(shè)這是一個網(wǎng)絡(luò)獲取的URL
NSString *path = @"http://pic.rpgsky.net/images/2016/07/26/3508cde5f0d29243c7d2ecbd6b9a30f1.png";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
//調(diào)用獲取圖片擴展名
NSString *string = [self contentTypeForImageData:data];
//輸出結(jié)果為 png
NSLog(@"%@",string);