1、方式一
- (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 @"未判断出来";
}
return @"未判断出来";
}
2、方式二
#define _FOUR_CC(c1,c2,c3,c4) ((uint32_t)(((c4) << 24) | ((c3) << 16) | ((c2) << 8) | (c1)))
#define _TWO_CC(c1,c2) ((uint16_t)(((c2) << 8) | (c1)))
NSString* ImageDetectType(NSData* imgData) {
CFDataRef data = ImageDetectType((__bridge CFDataRef)imgData);
if (!data) return @"数据为空";
uint64_t length = CFDataGetLength(data);
if (length < 16) return @"数据长度小鱼16";
const char *bytes = (char *)CFDataGetBytePtr(data);
uint32_t magic4 = *((uint32_t *)bytes);
switch (magic4) {
case _FOUR_CC(0x4D, 0x4D, 0x00, 0x2A): { // big endian TIFF
return @"big tiff";
} break;
case _FOUR_CC(0x49, 0x49, 0x2A, 0x00): { // little endian TIFF
return @"little tiff";
} break;
case _FOUR_CC(0x00, 0x00, 0x01, 0x00): { // ICO
return @"ico";
} break;
case _FOUR_CC('i', 'c', 'n', 's'): { // ICNS
return @"icns";
} break;
case _FOUR_CC('G', 'I', 'F', '8'): { // GIF
return @"gif";
} break;
case _FOUR_CC(0x89, 'P', 'N', 'G'): { // PNG
uint32_t tmp = *((uint32_t *)(bytes + 4));
if (tmp == _FOUR_CC('\r', '\n', 0x1A, '\n')) {
return @"png";
}
} break;
case _FOUR_CC('R', 'I', 'F', 'F'): { // WebP
uint32_t tmp = *((uint32_t *)(bytes + 8));
if (tmp == _FOUR_CC('W', 'E', 'B', 'P')) {
return @"webp";
}
} break;
}
uint16_t magic2 = *((uint16_t *)bytes);
switch (magic2) {
case _TWO_CC('B', 'A'):
case _TWO_CC('B', 'M'):
case _TWO_CC('I', 'C'):
case _TWO_CC('P', 'I'):
case _TWO_CC('C', 'I'):
case _TWO_CC('C', 'P'): { // BMP
return @"bmp";
}
case _TWO_CC(0xFF, 0x4F): { // JPEG2000
return @"jpeg2000";
}
}
if (memcmp(bytes,"\377\330\377",3) == 0) return @"jpeg";
if (memcmp(bytes + 4, "\152\120\040\040\015", 5) == 0) return @"jpeg2000";
return @"未知格式终止";
}