| // | |
| // UIImage+MultiFormat.m | |
| // SDWebImage | |
| // | |
| // Created by Olivier Poitrey on 07/06/13. | |
| // Copyright (c) 2013 Dailymotion. All rights reserved. | |
| // | |
| #import "UIImage+MultiFormat.h" | |
| #import "UIImage+GIF.h" | |
| #import "NSData+ImageContentType.h" | |
| #import <ImageIO/ImageIO.h> | |
| #ifdef SD_WEBP | |
| #import "UIImage+WebP.h" | |
| #endif | |
| @implementation UIImage (MultiFormat) | |
| + (UIImage *)sd_imageWithData:(NSData *)data { | |
| UIImage *image; | |
| NSString *imageContentType = [NSData sd_contentTypeForImageData:data]; | |
| if ([imageContentType isEqualToString:@"image/gif"]) { | |
| image = [UIImage sd_animatedGIFWithData:data]; | |
| } | |
| #ifdef SD_WEBP | |
| else if ([imageContentType isEqualToString:@"image/webp"]) | |
| { | |
| image = [UIImage sd_imageWithWebPData:data]; | |
| } | |
| #endif | |
| else { | |
| image = [[UIImage alloc] initWithData:data]; | |
| UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data]; | |
| if (orientation != UIImageOrientationUp) { | |
| image = [UIImage imageWithCGImage:image.CGImage | |
| scale:image.scale | |
| orientation:orientation]; | |
| } | |
| } | |
| return image; | |
| } | |
| +(UIImageOrientation)sd_imageOrientationFromImageData:(NSData *)imageData { | |
| UIImageOrientation result = UIImageOrientationUp; | |
| CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); | |
| if (imageSource) { | |
| CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL); | |
| if (properties) { | |
| CFTypeRef val; | |
| int exifOrientation; | |
| val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation); | |
| if (val) { | |
| CFNumberGetValue(val, kCFNumberIntType, &exifOrientation); | |
| result = [self sd_exifOrientationToiOSOrientation:exifOrientation]; | |
| } // else - if it's not set it remains at up | |
| CFRelease((CFTypeRef) properties); | |
| } else { | |
| //NSLog(@"NO PROPERTIES, FAIL"); | |
| } | |
| CFRelease(imageSource); | |
| } | |
| return result; | |
| } | |
| #pragma mark EXIF orientation tag converter | |
| // Convert an EXIF image orientation to an iOS one. | |
| // reference see here: http://sylvana.net/jpegcrop/exif_orientation.html | |
| + (UIImageOrientation) sd_exifOrientationToiOSOrientation:(int)exifOrientation { | |
| UIImageOrientation orientation = UIImageOrientationUp; | |
| switch (exifOrientation) { | |
| case 1: | |
| orientation = UIImageOrientationUp; | |
| break; | |
| case 3: | |
| orientation = UIImageOrientationDown; | |
| break; | |
| case 8: | |
| orientation = UIImageOrientationLeft; | |
| break; | |
| case 6: | |
| orientation = UIImageOrientationRight; | |
| break; | |
| case 2: | |
| orientation = UIImageOrientationUpMirrored; | |
| break; | |
| case 4: | |
| orientation = UIImageOrientationDownMirrored; | |
| break; | |
| case 5: | |
| orientation = UIImageOrientationLeftMirrored; | |
| break; | |
| case 7: | |
| orientation = UIImageOrientationRightMirrored; | |
| break; | |
| default: | |
| break; | |
| } | |
| return orientation; | |
| } | |
| @end |