6

我正在使用与此博客http://blog.logichigh.com/2008/06/05/uiimage-fix/上的代码类似的代码 在我用 iPhone 相机拍摄图像后旋转图像。我正在使用AVFoundation.

我在这里提取了相关代码:

    case UIImageOrientationUp: //EXIF = 1  
        transform = CGAffineTransformIdentity;  
        break;  

    case UIImageOrientationUpMirrored: //EXIF = 2  
        transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);  
        transform = CGAffineTransformScale(transform, -1.0, 1.0);  
        break;  

    case UIImageOrientationDown: //EXIF = 3  
        transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);  
        transform = CGAffineTransformRotate(transform, M_PI);  
        break;  

    case UIImageOrientationDownMirrored: //EXIF = 4  
        transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);  
        transform = CGAffineTransformScale(transform, 1.0, -1.0);  
        break;  

    case UIImageOrientationLeftMirrored: //EXIF = 5  
        boundHeight = bounds.size.height;  
        bounds.size.height = bounds.size.width;  
        bounds.size.width = boundHeight;  
        transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);  
        transform = CGAffineTransformScale(transform, -1.0, 1.0);  
        transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);  
        break;  

    case UIImageOrientationLeft: //EXIF = 6  
        boundHeight = bounds.size.height;  
        bounds.size.height = bounds.size.width;  
        bounds.size.width = boundHeight;  
        transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);  
        transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);  
        break;  

    case UIImageOrientationRightMirrored: //EXIF = 7  
        boundHeight = bounds.size.height;  
        bounds.size.height = bounds.size.width;  
        bounds.size.width = boundHeight;  
        transform = CGAffineTransformMakeScale(-1.0, 1.0);  
        transform = CGAffineTransformRotate(transform, M_PI / 2.0);  
        break;  

    case UIImageOrientationRight: //EXIF = 8  
        boundHeight = bounds.size.height;  
        bounds.size.height = bounds.size.width;  
        bounds.size.width = boundHeight;  
        transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);  
        transform = CGAffineTransformRotate(transform, M_PI / 2.0);  
        break;  

当手机放在XY轴上时,这可以正常工作。

但是,当我将手机放在Z轴上时。它总是显示UIImageEXIF = 2

我知道我可以使用加速度计来判断设备何时在Z轴上。但是,我看不到一条路径可以引导我在拍摄时区分图像,并标记了这个,因为它们仍然有EXIF = 2

即它可以让我区分在 Z 上拍摄的照片。但它不允许我区分照片本身,例如 Landscape1(左侧的 iPhone 主页按钮、纵向、横向 2(右侧的 iPhone 主页按钮)在此处输入图像描述

4

2 回答 2

0

我遇到了类似的问题。我根据设备方向将屏幕上的视图定位在某些位置。但是,如果设备平放而不明显处于横向或纵向,则方向的[[UIDevice currentDevice]方向] 是不可靠的。我最终通过使用[[[UIApplication] sharedApplication] statusBarOrientation]which 将始终返回状态栏在屏幕上显示的当前方向来解决这个问题。我在使用 Xamarin 和 C# 的 iOS 应用程序方面有更多经验,所以如果我的 ObjectiveC 有点偏离,请原谅我。

于 2013-08-08T00:03:59.740 回答
0

EXIF 数据只报告 XY 方向。EXIF 数据中没有任何内容可以告诉您相机是朝上还是朝下。您可以在捕获图像时获取设备方向:

[[UIDevice currentDevice] orientation]

然后,您只需将图像及其上/下方向与 EXIF 数据分开。如果您将图像存储在应用程序中,则可以使用简单的数据库表,甚至可以使用图像名称作为键和向上/向下方向作为值的序列化 NSDictionary。

于 2013-08-07T20:09:19.447 回答