UIImage+fixOrientation.h
#import <UIKit/UIKit.h> @interface UIImage (fixOrientation) /** 将当前的图片旋转一下 */ - (UIImage *)fixOrientation; /** 按当前屏幕的分辨率的倍数缩放图片大小 */ - (UIImage *)imageCompress; /** 根据ImageView的Size进行缩放 */ - (UIImage *)imageCompressWithImageViewSize:(CGSize)vSize; /** 根据ImageView的Size进行裁剪图片 */ - (UIImage *)imageCompressWithImageViewNoAutoChangeWithSize:(CGSize)vSize; @end
UIImage+fixOrientation.m
#import "UIImage+fixOrientation.h" @implementation UIImage (fixOrientation) - (UIImage *)fixOrientation{ // No-op if the orientation is already correct if (self.imageOrientation == UIImageOrientationUp) return self; // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. CGAffineTransform transform = CGAffineTransformIdentity; switch (self.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, 0); transform = CGAffineTransformRotate(transform, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, 0, self.size.height); transform = CGAffineTransformRotate(transform, -M_PI_2); break; case UIImageOrientationUp: case UIImageOrientationUpMirrored: break; } switch (self.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, self.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationUp: case UIImageOrientationDown: case UIImageOrientationLeft: case UIImageOrientationRight: break; } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height, CGImageGetBitsPerComponent(self.CGImage), 0, CGImageGetColorSpace(self.CGImage), CGImageGetBitmapInfo(self.CGImage)); CGContextConcatCTM(ctx, transform); switch (self.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: // Grr... CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage); break; default: CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage); break; } // And now we just create a new UIImage from the drawing context CGImageRef cgimg = CGBitmapContextCreateImage(ctx); UIImage *img = [UIImage imageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); return img; } - (UIImage *)imageCompress{ // CGSize size = self.size; // CGFloat width = size.width; // CGFloat height = size.height; // NSInteger retinalMutipler = [UIScreen mainScreen].scale; // CGFloat scale = kAllWidth*1.0*retinalMutipler/width; // CGFloat scaleWidth = width*scale; // CGFloat scaleHeight = height*scale; // UIGraphicsBeginImageContext(size);//this will crop // [self drawInRect:CGRectMake(0, 0, scaleWidth, scaleHeight)]; // UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); // UIGraphicsEndImageContext(); UIImage *newImage = nil; @autoreleasepool { NSInteger retinalMutipler = [UIScreen mainScreen].scale; CGSize targetSize = CGSizeMake(0, 0); //判断长宽 if (self.size.height>=self.size.width) { //高度长宽度短的图片 //计算宽度占高度的比例 CGFloat widthHeightRate = self.size.width*1.0/self.size.height; CGFloat scaleHeight = kAllHeight*1.0*retinalMutipler; CGFloat scaleWidth = scaleHeight*widthHeightRate; targetSize = CGSizeMake(scaleWidth, scaleHeight); }else{ //宽度长高度短的图片 //计算高度占宽度的比例 CGFloat heightWidthRate = self.size.height*1.0/self.size.width; CGFloat scaleWidth = kAllWidth*1.0*retinalMutipler; CGFloat scaleHeight = scaleWidth*heightWidthRate; targetSize = CGSizeMake(scaleWidth, scaleHeight); } //CGSize targetSize = CGSizeMake(retinalMutipler*kAllWidth, retinalMutipler*kAllHeight); UIGraphicsBeginImageContext(targetSize); [self drawInRect:CGRectMake(0, 0, targetSize.width, targetSize.height)]; newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } return newImage; } - (UIImage *)imageCompressWithImageViewSize:(CGSize)vSize{ if (CGSizeEqualToSize(vSize, CGSizeZero)) { return [self imageCompress]; } UIImage *newImage = nil; @autoreleasepool { //源文件大小 CGSize sourceSize = self.size; //屏幕的缩放比例 NSInteger retinalMutipler = [UIScreen mainScreen].scale; //设置画板的Size vSize = CGSizeMake(retinalMutipler*vSize.width, retinalMutipler*vSize.height); //获取宽度和高度的缩放比例 CGFloat widthRate = vSize.width*1.0/sourceSize.width; CGFloat heightRate = vSize.height*1.0/sourceSize.height; //判断哪个比例最小,就用哪个比例进行缩放 CGSize targetSize = CGSizeZero; if (widthRate <= heightRate) { targetSize.width = sourceSize.width * widthRate; targetSize.height = sourceSize.height * widthRate; }else{ targetSize.width = sourceSize.width * heightRate; targetSize.height = sourceSize.height * heightRate; } //获取绘制图片的X和Y CGFloat targetX = floorf((vSize.width - targetSize.width)/2.0); CGFloat targetY = floorf((vSize.height - targetSize.height)/2.0); UIGraphicsBeginImageContext(vSize); [self drawInRect:CGRectMake(targetX, targetY, targetSize.width, targetSize.height)]; newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } return newImage; } - (UIImage *)imageCompressWithImageViewNoAutoChangeWithSize:(CGSize)vSize{ if (CGSizeEqualToSize(vSize, CGSizeZero)) { return [self imageCompress]; } UIImage *newImage = nil; @autoreleasepool { //源文件大小 CGSize sourceSize = self.size; //屏幕的缩放比例 NSInteger retinalMutipler = [UIScreen mainScreen].scale; //设置画板的Size vSize = CGSizeMake(retinalMutipler*vSize.width, retinalMutipler*vSize.height); //获取宽度和高度的缩放比例 CGFloat widthRate = vSize.width*1.0/sourceSize.width; CGFloat heightRate = vSize.height*1.0/sourceSize.height; //判断哪个比例较大,就用哪个比例进行缩放 CGSize targetSize = CGSizeZero; if (widthRate >= heightRate) { targetSize.width = sourceSize.width * widthRate; targetSize.height = sourceSize.height * widthRate; }else{ targetSize.width = sourceSize.width * heightRate; targetSize.height = sourceSize.height * heightRate; } //获取绘制图片的X和Y CGFloat targetX = floorf((vSize.width - targetSize.width)/2.0); CGFloat targetY = floorf((vSize.height - targetSize.height)/2.0); UIGraphicsBeginImageContext(vSize); [self drawInRect:CGRectMake(targetX, targetY, targetSize.width, targetSize.height)]; newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } return newImage; } @end