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 charchar *bytes = (charchar *)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 @"未知格式终止";
- }