用相機拍攝出來的照片含有EXIF信息,UIImage的imageOrientation屬性指的就是EXIF中的orientation信息。
如果我們忽略orientation信息,而直接對照片進行像素處理或者drawInRect等操作,得到的結果是翻轉或者旋轉90之後的樣子。這是因爲我們執行像素處理或者drawInRect等操作之後,imageOrientaion信息被刪除了,imageOrientaion被重設爲0,造成照片內容和imageOrientaion不匹配。
所以,在對照片進行處理之前,先將照片旋轉到正確的方向,並且返回的imageOrientaion爲0。
下面這個方法就是一個UIImage category中的方法,用它可以達到以上目的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
-
(UIImage *)fixOrientation:(UIImage *)aImage { //
No-op if the orientation is already correct if
(aImage.imageOrientation == UIImageOrientationUp) return
aImage; //
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
(aImage.imageOrientation) { case
UIImageOrientationDown: case
UIImageOrientationDownMirrored: transform
= CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height); transform
= CGAffineTransformRotate(transform, M_PI); break ; case
UIImageOrientationLeft: case
UIImageOrientationLeftMirrored: transform
= CGAffineTransformTranslate(transform, aImage.size.width, 0 ); transform
= CGAffineTransformRotate(transform, M_PI_2); break ; case
UIImageOrientationRight: case
UIImageOrientationRightMirrored: transform
= CGAffineTransformTranslate(transform, 0 ,
aImage.size.height); transform
= CGAffineTransformRotate(transform, -M_PI_2); break ; default : break ; } switch
(aImage.imageOrientation) { case
UIImageOrientationUpMirrored: case
UIImageOrientationDownMirrored: transform
= CGAffineTransformTranslate(transform, aImage.size.width, 0 ); transform
= CGAffineTransformScale(transform, - 1 ,
1 ); break ; case
UIImageOrientationLeftMirrored: case
UIImageOrientationRightMirrored: transform
= CGAffineTransformTranslate(transform, aImage.size.height, 0 ); transform
= CGAffineTransformScale(transform, - 1 ,
1 ); break ; default : break ; } //
Now we draw the underlying CGImage into a new context, applying the transform //
calculated above. CGContextRef
ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage),
0 , CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage)); CGContextConcatCTM(ctx,
transform); switch
(aImage.imageOrientation) { case
UIImageOrientationLeft: case
UIImageOrientationLeftMirrored: case
UIImageOrientationRight: case
UIImageOrientationRightMirrored: //
Grr... CGContextDrawImage(ctx,
CGRectMake( 0 , 0 ,aImage.size.height,aImage.size.width),
aImage.CGImage); break ; default : CGContextDrawImage(ctx,
CGRectMake( 0 , 0 ,aImage.size.width,aImage.size.height),
aImage.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; } |