| | |
| | | */ |
| | | |
| | | #import "NSData+ImageContentType.h" |
| | | #if SD_MAC |
| | | #import <CoreServices/CoreServices.h> |
| | | #else |
| | | #import <MobileCoreServices/MobileCoreServices.h> |
| | | #endif |
| | | |
| | | // Currently Image/IO does not support WebP |
| | | #define kSDUTTypeWebP ((__bridge CFStringRef)@"public.webp") |
| | | // AVFileTypeHEIC is defined in AVFoundation via iOS 11, we use this without import AVFoundation |
| | | #define kSDUTTypeHEIC ((__bridge CFStringRef)@"public.heic") |
| | | |
| | | @implementation NSData (ImageContentType) |
| | | |
| | |
| | | return SDImageFormatUndefined; |
| | | } |
| | | |
| | | // File signatures table: http://www.garykessler.net/library/file_sigs.html |
| | | uint8_t c; |
| | | [data getBytes:&c length:1]; |
| | | switch (c) { |
| | |
| | | case 0x49: |
| | | case 0x4D: |
| | | return SDImageFormatTIFF; |
| | | case 0x52: |
| | | // R as RIFF for WEBP |
| | | if (data.length < 12) { |
| | | return SDImageFormatUndefined; |
| | | case 0x52: { |
| | | if (data.length >= 12) { |
| | | //RIFF....WEBP |
| | | NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; |
| | | if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { |
| | | return SDImageFormatWebP; |
| | | } |
| | | } |
| | | |
| | | NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; |
| | | if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { |
| | | return SDImageFormatWebP; |
| | | break; |
| | | } |
| | | case 0x00: { |
| | | if (data.length >= 12) { |
| | | //....ftypheic ....ftypheix ....ftyphevc ....ftyphevx |
| | | NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(4, 8)] encoding:NSASCIIStringEncoding]; |
| | | if ([testString isEqualToString:@"ftypheic"] |
| | | || [testString isEqualToString:@"ftypheix"] |
| | | || [testString isEqualToString:@"ftyphevc"] |
| | | || [testString isEqualToString:@"ftyphevx"]) { |
| | | return SDImageFormatHEIC; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | return SDImageFormatUndefined; |
| | | } |
| | | |
| | | + (nonnull CFStringRef)sd_UTTypeFromSDImageFormat:(SDImageFormat)format { |
| | | CFStringRef UTType; |
| | | switch (format) { |
| | | case SDImageFormatJPEG: |
| | | UTType = kUTTypeJPEG; |
| | | break; |
| | | case SDImageFormatPNG: |
| | | UTType = kUTTypePNG; |
| | | break; |
| | | case SDImageFormatGIF: |
| | | UTType = kUTTypeGIF; |
| | | break; |
| | | case SDImageFormatTIFF: |
| | | UTType = kUTTypeTIFF; |
| | | break; |
| | | case SDImageFormatWebP: |
| | | UTType = kSDUTTypeWebP; |
| | | break; |
| | | case SDImageFormatHEIC: |
| | | UTType = kSDUTTypeHEIC; |
| | | break; |
| | | default: |
| | | // default is kUTTypePNG |
| | | UTType = kUTTypePNG; |
| | | break; |
| | | } |
| | | return UTType; |
| | | } |
| | | |
| | | @end |