I used Mats to create a simple category in NSData that tells me whether its contents are JPEG or PNG based on its first 4 bytes:
@interface NSData (yourCategory) - (BOOL)isJPG; - (BOOL)isPNG; @end @implementation NSData (yourCategory) - (BOOL)isJPG { if (self.length > 4) { unsigned char buffer[4]; [self getBytes:&buffer length:4]; return buffer[0]==0xff && buffer[1]==0xd8 && buffer[2]==0xff && buffer[3]==0xe0; } return NO; } - (BOOL)isPNG { if (self.length > 4) { unsigned char buffer[4]; [self getBytes:&buffer length:4]; return buffer[0]==0x89 && buffer[1]==0x50 && buffer[2]==0x4e && buffer[3]==0x47; } return NO; } @end
And then just do:
CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((CFDataRef) imgData); CGImageRef imgRef = nil; if ([imgData isJPG]) imgRef = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault); else if ([imgData isPNG]) imgRef = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault); UIImage* image = [UIImage imageWithCGImage:imgRef]; CGImageRelease(imgRef); CGDataProviderRelease(imgDataProvider);
source share