转载地址:http://www.cnblogs.com/yajunLi/p/5796084.html
问题描述:
手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在web端查看会有一个左旋90度的问题。
并且照片竖怕才会有此问题,横拍不存在。
原因分析:
手机拍照时,用相机拍摄出来的照片是含有EXIF信息的,在我们得到 UIImage时,可以查看此Image的imageOrientation属性,其实就是指的EXIF中的orientation信息。
如果我们忽略orientation信息,而直接对照片进行像素处理或上传等操作,得到的结果是翻转或者旋转90之后的样子。
这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。
所以,在对照片进行处理之前,先将照片旋转到正确的方向,保证返回的imageOrientaion为0。
解决方法:
Swift版:
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
|
/**
照片竖拍 web显示旋转解决:图片大于2M会自动旋转90度
- parameter aImage: <#aImage description#>
- returns: <#return value description#>
*/
class
func
fixOrientation
(
aImage
:
UIImage
)-
>
UIImage
{
if
aImage
.
imageOrientation
==
UIImageOrientation
.
Up
{
return
aImage
}
var
transform
=
CGAffineTransformIdentity
switch
(
aImage
.
imageOrientation
) {
case
.
Down
,.
DownMirrored
:
transform
=
CGAffineTransformTranslate
(
transform
,
aImage
.
size
.
width
,
aImage
.
size
.
height
)
transform
=
CGAffineTransformRotate
(
transform
,
CGFloat
(
M_PI
))
break
;
case
.
Left
,.
LeftMirrored
:
transform
=
CGAffineTransformTranslate
(
transform
,
aImage
.
size
.
width
,
0
)
transform
=
CGAffineTransformRotate
(
transform
,
CGFloat
(
M_PI_2
))
break
;
case
.
Right
,.
RightMirrored
:
transform
=
CGAffineTransformTranslate
(
transform
,
0
,
aImage
.
size
.
height
)
transform
=
CGAffineTransformRotate
(
transform
,
CGFloat
(-
M_PI_2
))
break
;
default
:
break
;
}
switch
(
aImage
.
imageOrientation
) {
case
.
UpMirrored
,.
DownMirrored
:
transform
=
CGAffineTransformTranslate
(
transform
,
aImage
.
size
.
width
,
0
)
transform
=
CGAffineTransformScale
(
transform
, -
1
,
1
)
break
;
case
.
LeftMirrored
,.
RightMirrored
:
transform
=
CGAffineTransformTranslate
(
transform
,
aImage
.
size
.
height
,
0
)
transform
=
CGAffineTransformScale
(
transform
, -
1
,
1
)
break
;
default
:
break
;
}
let
ctx
:
CGContextRef
=
CGBitmapContextCreate
(
nil
,
Int
(
aImage
.
size
.
width
),
Int
(
aImage
.
size
.
height
),
CGImageGetBitsPerComponent
(
aImage
.
CGImage
),
0
,
CGImageGetColorSpace
(
aImage
.
CGImage
),
1
)!
CGContextConcatCTM
(
ctx
,
transform
)
switch
(
aImage
.
imageOrientation
) {
case
.
Left
,.
LeftMirrored
,.
Right
,.
RightMirrored
:
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
;
}
let
cgimg
:
CGImageRef
=
CGBitmapContextCreateImage
(
ctx
)!
let
img
:
UIImage
=
UIImage
(
CGImage
:
cgimg
)
return
img
;
}
|
OC版:
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;
}
|
亲测,在完成拍照代理里,获取到图片后,用此方法处理后,再上传服务器,可解决该问题。
1
2
3
4
5
6
7
8
9
10
11
12
|
//若是图片
var
img
:
UIImage
=
info
[
UIImagePickerControllerOriginalImage
]
as
!
UIImage
//保存相册
UIImageWriteToSavedPhotosAlbum
(
img
,
self
,
nil
,
nil
)
img
=
PublicMethod
.
fixOrientation
(
img
)
//压缩图片
let
imgData
:
NSData
=
UIImageJPEGRepresentation
(
img
,
0.2
)!
//上传服务器
self
.
uploadHeadImg
(
imgData
,
headImage
:
img
)
|
参考文献:http://blog.csdn.net/hitwhylz/article/details/39518463