/*
|
* This file is part of the SDWebImage package.
|
* (c) Olivier Poitrey <rs@dailymotion.com>
|
* (c) Fabrice Aneche
|
*
|
* For the full copyright and license information, please view the LICENSE
|
* file that was distributed with this source code.
|
*/
|
|
#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)
|
|
+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {
|
if (!data) {
|
return SDImageFormatUndefined;
|
}
|
|
// File signatures table: http://www.garykessler.net/library/file_sigs.html
|
uint8_t c;
|
[data getBytes:&c length:1];
|
switch (c) {
|
case 0xFF:
|
return SDImageFormatJPEG;
|
case 0x89:
|
return SDImageFormatPNG;
|
case 0x47:
|
return SDImageFormatGIF;
|
case 0x49:
|
case 0x4D:
|
return SDImageFormatTIFF;
|
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;
|
}
|
}
|
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
|