12

基本タスク: UIImage に関連付けられたメタデータの EXIF 方向プロパティを更新します。私の問題は、方向プロパティがすべての EXIF 情報のどこにあるかわからないことです。


複雑な背景:によって返される画像の向きを変更しているimagePickerController:didFinishPickingMediaWithInfo:ため、画像を で保存する前にメタデータも更新する必要があると考えていwriteImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadataます。

つまり、変更しない限り、メタデータには古い/初期の向きが含まれるため、間違ったものになります。Core Image向きを変更する理由は、顔検出ルーチンを実行するときにつまずき続けるためです。iPhone(デバイス)をポートレートモードでフロントカメラを使用して写真を撮影すると、向きはUIImageOrientationRight(3)になります。向きが (0) になるように画像を書き換えると、UIImageOrientationUp良好な顔検出結果が得られます。参考までに、画像を書き換えるルーチンを以下に示します。

カメラの向き全体が非常にわかりにくく、コードの穴に深く入り込んでいるような気がします。私は投稿を見てきました(ここここここ。そしてこの投稿によると(https://stackoverflow.com/a/3781192/840992):

「カメラは実際には横向きのネイティブなので、横向きで写真を撮ると上または下になり、縦向きで写真を撮ると左または右になります(デバイスの持ち方によって異なります)。」

...これは完全に混乱しています。UIImageOrientationLeftMirrored上記が当てはまる場合UIImageOrientationRightMirrored、フロントカメラの方向を取得する必要があると思います。CIDetectorそして、これは、ピッカーによって返された処女イメージが失敗した理由を説明するものではありません。

私はこのお尻に後ろ向きに近づいていますが、向きを合わせることができないようです...


-(UIImage *)normalizedImage:(UIImage *) thisImage
{
    if (thisImage.imageOrientation == UIImageOrientationUp) return thisImage;

    UIGraphicsBeginImageContextWithOptions(thisImage.size, NO, thisImage.scale);
    [thisImage drawInRect:(CGRect){0, 0, thisImage.size}];
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return normalizedImage;
}
4

2 に答える 2

23

ここで私の答えを見てください:
UIImagePickerController を強制的に縦方向/寸法 iOS で写真を撮る

関連する github のプロジェクト(プロジェクトを実行する必要はありません。readme を参照してください) 。

メタデータの書き込みよりも読み取りに関心がありますが、Apple の imageOrientation と対応する向きの 'Exif' メタデータに関するいくつかのメモが含まれています。

これも読む価値があるかもしれません
IOS 6.0 または iPhone でのアップロード中にキャプチャされた写真が自動的に回転します

画像の向きを示すために、2 つの異なる定数番号規則が使用されています。

  1. TIFF/IPTC 画像メタデータ タグで使用される kCGImagePropertyOrientation 定数
  2. UIImage imageOrientation プロパティで使用される UIImageOrientation 定数。

iPhone のネイティブ カメラの向きは、横向きの左 (ホーム ボタンが右向き) です。ネイティブ ピクセルの寸法は常にこれを反映し、回転フラグを使用して画像をディスプレイの向きに合わせて正しく配置します。

Apple            UIImage.imageOrientation     TIFF/IPTC kCGImagePropertyOrientation

iPhone native     UIImageOrientationUp    = 0  =  Landscape left  = 1  
rotate 180deg     UIImageOrientationDown  = 1  =  Landscape right = 3  
rotate 90CCW      UIImageOrientationLeft  = 2  =  Portrait  down  = 8  
rotate 90CW       UIImageOrientationRight = 3  =  Portrait  up    = 6  

UIImageOrientation4-7 はkCGImagePropertyOrientation2,4,5,7 にマップされます - これらはミラー化された対応物です。

UIImage は、基になる kCGImagePropertyOrientation フラグから imagerOrientation プロパティを派生させます。これが、読み取り専用プロパティである理由です。これは、メタデータ フラグが正しく設定されている限り、imageOrientation が正しく追従することを意味します。しかし、変換を適用するために数値を読み取っている場合は、どの数値を見ているのかを認識する必要があります。

于 2013-01-28T00:36:17.433 に答える