ALAsset中的Photo的方向行为不正确

时间:2012-01-12 09:17:37

标签: iphone image orientation alassetslibrary

我目前有一个使用ALAsssetsLibrary来获取照片的应用。我已将照片放到图像视图中,我可以上传到服务器。当我在拍摄一些照片后在真实设备上进行测试时,我发现应该在肖像中拍摄的照片变成了风景。

因此,我调用了不同的函数来获取这样的CGImage:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage] scale:1.0 orientation:(UIImageOrientation)[representation orientation]];

第一次试用了,我用过这个:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage]]

我认为那个有尺度和方向的人可以给我正确的照片拍摄方向。但它没有给我正确的解决方案。

我是否遗漏了生成正确照片方向所需的任何内容?

4 个答案:

答案 0 :(得分:45)

正确的方向处理取决于您使用的iOS版本。 在iOS4和iOS 5上,缩略图已经正确旋转,因此您可以在不指定任何旋转参数的情况下初始化UIImage。 但是对于fullScreenImage,每个iOS版本的行为都不同。在iOS 5上,图像已经在iOS 4上旋转而不是。

所以在iOS4上你应该使用:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation];
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] 
                                                     scale:[defaultRep scale] orientation:(UIImageOrientation)[defaultRep orientation]];

在iOS5上,以下代码应该可以正常工作:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation];
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] scale:[defaultRep scale] orientation:0];

干杯,

亨德里克

答案 1 :(得分:4)

试试这段代码: -

 UIImage* img = [UIImage imageWithCGImage:asset.thumbnail];
 img = [UIImage imageWithCGImage:img.CGImage scale:1.0 orientation:UIImageOrientationUp];

这可能会对你有帮助。

答案 2 :(得分:3)

我的经验仅限于IOS 5.x,但我可以告诉您缩略图和全屏图像的方向正确。这是垂直拍摄时水平的全分辨率图像。我的解决方案是使用我从这里获得的uiimage类别:

http://www.catamount.com/forums/viewtopic.php?f=21&t=967&start=0

它在UIImage上提供了一个很好的旋转方法,如下所示:

        UIImage *tmp = [UIImage imageWithCGImage:startingFullResolutionImage];
        startingFullResolutionImage = [[tmp imageRotatedByDegrees:-90.0f] CGImage];

答案 3 :(得分:0)

对于fullResolutionImage,我想提供如下解决方案,

ALAssetRepresentation *rep = [asset defaultRepresentation];

// First, write orientation to UIImage, i.e., EXIF message.
UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage] scale:rep.scale orientation:(UIImageOrientation)rep.orientation];
// Second, fix orientation, and drop out EXIF
if (image.imageOrientation != UIImageOrientationUp) {
   UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
   [image drawInRect:(CGRect){0, 0, image.size}];
   UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();
   image = normalizedImage;
}
// Third, compression
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);

imageData就是您想要的,只需将其上传到您的照片服务器。

顺便说一下,如果您认为EXIF很有用,您可以根据需要将其补充到normalizedImage