一、概述
有时候单单获取图片的后缀名是无法判断该图片的类型,因此我们需要一种更准确的识别方式:读取图片数据的文件识别头。(每一个图片都由识别头+data组成)
二、一些已知的图片文件头标识
JPEG
文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识)
文件结束标识 (2 bytes): 0xff, 0xd9 (EOI)TGA
未压缩的前5字节 00 00 02 00 00
RLE压缩的前5字节 00 00 10 00 00PNG
文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0AGIF
文件头标识 (6 bytes) 47 49 46 38 39(37) 61 (G I F 8 9 (7) a)BMP
文件头标识 (2 bytes) 42 4D (B M)PCX
文件头标识 (1 bytes) 0ATIFF
文件头标识 (2 bytes) 4D 4D 或 49 49ICO
文件头标识 (8 bytes) 00 00 01 00 01 00 20 20CUR
文件头标识 (8 bytes) 00 00 02 00 01 00 20 20IFF
文件头标识 (4 bytes) 46 4F 52 4D (F O R M)ANI
文件头标识 (4 bytes) 52 49 46 46(R I F F)
三、代码判断
+ (NSString *)sd_contentTypeForImageData:(NSData *)data {
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"image/jpeg";
case 0x89:
return @"image/png";
case 0x47:
return @"image/gif";
case 0x49:
case 0x4D:
return @"image/tiff";
case 0x0A:
return @"image/pca";
case 0x52:
// R as RIFF for WEBP
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 @"image/webp";
}
return nil;
}
return nil;
}