基本タスク: 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;
}