问题描述:直接从系统相册中获取到的image的信息为:
<UIImage: 0x170297750> size {1596, 1598} orientation 0 scale 1.000000
直接调用系统相机拍摄获取的照片时的image信息:
<UIImage: 0x174297520> size {3024, 4032} orientation 3 scale 1.000000
就是orientation参数不一样,导致在截图时,orientation 0 可以正确的获取到截得的正确区域,但是orientation 3获取的截图区域就乱了。明显orientation时一个控制方向的参数:
修改这个bug的方法如下://在通过 UIImagePickerControllerDelegate 获取到image时,调用下面的
- (UIImage *)fixOrientation:(UIImage *)aImage 方法将相片位置调好,即可:
1 //修复照片的方向问题 2 - (UIImage *)fixOrientation:(UIImage *)aImage 3 { 4 if (aImage.imageOrientation == UIImageOrientationUp) 5 6 return aImage; 7 8 CGAffineTransform transform = CGAffineTransformIdentity; 9 10 switch (aImage.imageOrientation) 11 { 12 case UIImageOrientationDown: 13 case UIImageOrientationDownMirrored: 14 transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height); 15 transform = CGAffineTransformRotate(transform, M_PI); 16 break; 17 18 case UIImageOrientationLeft: 19 case UIImageOrientationLeftMirrored: 20 transform = CGAffineTransformTranslate(transform, aImage.size.width, 0); 21 transform = CGAffineTransformRotate(transform, M_PI_2); 22 break; 23 24 case UIImageOrientationRight: 25 case UIImageOrientationRightMirrored: 26 transform = CGAffineTransformTranslate(transform, 0, aImage.size.height); 27 transform = CGAffineTransformRotate(transform, -M_PI_2); 28 break; 29 default: 30 break; 31 } 32 33 switch (aImage.imageOrientation) 34 { 35 case UIImageOrientationUpMirrored: 36 case UIImageOrientationDownMirrored: 37 transform = CGAffineTransformTranslate(transform, aImage.size.width, 0); 38 transform = CGAffineTransformScale(transform, -1, 1); 39 break; 40 41 case UIImageOrientationLeftMirrored: 42 case UIImageOrientationRightMirrored: 43 transform = CGAffineTransformTranslate(transform, aImage.size.height, 0); 44 transform = CGAffineTransformScale(transform, -1, 1); 45 break; 46 default: 47 break; 48 } 49 50 CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, 51 CGImageGetBitsPerComponent(aImage.CGImage), 0, 52 CGImageGetColorSpace(aImage.CGImage), 53 CGImageGetBitmapInfo(aImage.CGImage)); 54 CGContextConcatCTM(ctx, transform); 55 switch (aImage.imageOrientation) 56 { 57 case UIImageOrientationLeft: 58 case UIImageOrientationLeftMirrored: 59 case UIImageOrientationRight: 60 case UIImageOrientationRightMirrored: 61 CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage); 62 break; 63 64 default: 65 CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage); 66 break; 67 } 68 69 CGImageRef cgimg = CGBitmapContextCreateImage(ctx); 70 UIImage *img = [UIImage imageWithCGImage:cgimg]; 71 CGContextRelease(ctx); 72 CGImageRelease(cgimg); 73 return img; 74 }