iOS系统相册中选择照片和直接调用相机拍摄获取的相片截图时的区别

问题描述:直接从系统相册中获取到的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 }

 

posted @ 2017-09-19 14:07  isHakan  阅读(676)  评论(0编辑  收藏  举报