| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- //
- // UIImage+Utility.m
- // XHImageViewer
- //
- // Created by 曾 宪华 on 14-2-18.
- // Copyright (c) 2014年 曾宪华 开发团队(http://iyilunba.com ) 本人QQ:543413507 本人QQ群(142557668). All rights reserved.
- //
- #import "UIImage+Utility.h"
- @implementation UIImage (Utility)
- + (UIImage *)decode:(UIImage *)image {
- if(image==nil) { return nil; }
-
- UIGraphicsBeginImageContext(image.size);
- {
- [image drawAtPoint:CGPointMake(0, 0)];
- image = UIGraphicsGetImageFromCurrentImageContext();
- }
- UIGraphicsEndImageContext();
-
- return image;
- }
- + (UIImage *)fastImageWithData:(NSData *)data {
- UIImage *image = [UIImage imageWithData:data];
- return [self decode:image];
- }
- + (UIImage *)fastImageWithContentsOfFile:(NSString *)path {
- UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];
- return [self decode:image];
- }
- + (UIImage* )rotateImage:(UIImage *)image {
- int kMaxResolution = 1080;
- // Or whatever
- CGImageRef imgRef = image.CGImage;
- CGFloat width = CGImageGetWidth(imgRef);
- CGFloat height = CGImageGetHeight(imgRef);
- CGAffineTransform transform = CGAffineTransformIdentity;
- CGRect bounds = CGRectMake(0, 0, width, height);
- if (width > kMaxResolution || height > kMaxResolution) {
- CGFloat ratio = width / height;
- if (ratio > 1 ) {
- bounds.size.width = kMaxResolution;
- bounds.size.height = bounds.size.width / ratio;
- }
- else {
- bounds.size.height = kMaxResolution;
- bounds.size.width = bounds.size.height * ratio;
- }
- }
- CGFloat scaleRatio = bounds.size.width / width;
- CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
- CGFloat boundHeight;
- UIImageOrientation orient = image.imageOrientation;
- switch (orient) {
- case UIImageOrientationUp:
- //EXIF = 1
- transform = CGAffineTransformIdentity;
- break;
- case UIImageOrientationUpMirrored:
- //EXIF = 2
- transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
- transform = CGAffineTransformScale(transform, -1.0, 1.0 );
- break;
- case UIImageOrientationDown:
- //EXIF = 3
- transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
- transform = CGAffineTransformRotate(transform, M_PI);
- break;
- case UIImageOrientationDownMirrored:
- //EXIF = 4
- transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
- transform = CGAffineTransformScale(transform, 1.0, -1.0);
- break;
- case UIImageOrientationLeftMirrored:
- //EXIF = 5
- boundHeight = bounds.size.height;
- bounds.size.height = bounds.size.width;
- bounds.size.width = boundHeight;
- transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width );
- transform = CGAffineTransformScale(transform, -1.0, 1.0);
- transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0 );
- break;
- case UIImageOrientationLeft:
- //EXIF = 6
- boundHeight = bounds.size.height;
- bounds.size.height = bounds.size.width;
- bounds.size.width = boundHeight;
- transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
- transform = CGAffineTransformRotate( transform, 3.0 * M_PI / 2.0 );
- break;
- case UIImageOrientationRightMirrored:
- //EXIF = 7
- boundHeight = bounds.size.height;
- bounds.size.height = bounds.size.width;
- bounds.size.width = boundHeight;
- transform = CGAffineTransformMakeScale(-1.0, 1.0);
- transform = CGAffineTransformRotate( transform, M_PI / 2.0);
- break;
- case UIImageOrientationRight:
- //EXIF = 8
- boundHeight = bounds.size.height;
- bounds.size.height = bounds.size.width;
- bounds.size.width = boundHeight;
- transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
- transform = CGAffineTransformRotate(transform, M_PI / 2.0 );
- break;
- default:
- [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];
- }
- UIGraphicsBeginImageContext(bounds.size);
- CGContextRef context = UIGraphicsGetCurrentContext();
- if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
- CGContextScaleCTM(context, -scaleRatio, scaleRatio);
- CGContextTranslateCTM(context, -height, 0);
- }
- else {
- CGContextScaleCTM(context, scaleRatio, -scaleRatio);
- CGContextTranslateCTM(context, 0, -height);
- }
- CGContextConcatCTM(context, transform );
- CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
- UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return imageCopy;
- }
- @end
|