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;  

これは、電話がXまたはY軸に保持されている場合に正常に機能します。

ただし、電話をZ軸に持っていると。が を持っていることを常に示していUIImageますEXIF = 2

Z加速度計を使用して、デバイスが軸上にあることを知ることができます。ただし、すべての画像にまだEXIF = 2.

つまり、Z で撮影された写真を区別することはできますが、写真自体を区別することはできません。たとえば、Landscape1 (左側の iPhone ホーム ボタン、Portrait、Landscape2 (右側の iPhone ホーム ボタン))ここに画像の説明を入力

4

2 に答える 2

0

EXIF データは XY 方向のみを報告します。カメラが上向きか下向きかを示す EXIF データはありません。画像をキャプチャするときにデバイスの向きを取得できます。

[[UIDevice currentDevice] orientation]

次に、画像とその上下の向きを EXIF データとは別に追跡する必要があります。アプリに画像を保存する場合は、単純なデータベース テーブル、または画像名をキー、上下方向を値とするシリアル化された NSDictionary で十分です。

于 2013-08-07T20:09:19.447 に答える
0

同様の問題に遭遇しました。デバイスの向きに応じて、画面上の特定の位置にビューを配置していました。ただし、デバイスが明らかに横向きまたは縦向きにならずに平らに置いていた場合、向きからの[[UIDevice currentDevice]向きは信頼できませんでした。[[[UIApplication] sharedApplication] statusBarOrientation]ステータスバーが画面に表示されている現在の向きを常に返す which を使用して、これを解決することになりました。C# で Xamarin を使用する iOS アプリの経験が豊富なので、ObjectiveC が少しずれていても許してください。

于 2013-08-08T00:03:59.740 に答える