過去数週間、私はObjective-cで画像を操作していて、多くの奇妙な動作に気づいていました。まず、他の多くの人と同じように、カメラで撮影した画像(または他の人のカメラで撮影してMMSを使用した画像)が90度回転するという問題が発生しています。なぜこれが世界で起こっているのかはわかりませんでしたが(したがって私の質問です)、安価な回避策を思いつくことができました。
今回の私の質問は、なぜこれが起こっているのかということです。Appleが画像を回転させるのはなぜですか?カメラを表向きにして写真を撮るときは、上記のコードを実行しない限り、写真を保存すると回転して保存されます。さて、私の回避策は数日前までは大丈夫でした。
私のアプリケーションは、画像の個々のピクセル、特にPNGのアルファチャネルを変更します(そのため、私のシナリオでは、JPEG変換はウィンドウの外にスローされます)。数日前、回避策コードのおかげで画像がアプリに正しく表示されていても、アルゴリズムが画像の個々のピクセルを変更すると、画像が回転していると見なされることに気付きました。したがって、画像の上部のピクセルを変更する代わりに、画像の側面のピクセルを変更します(回転する必要があると考えられるため)。メモリ内の画像を回転させる方法がわかりません。理想的には、そのimageOrientation
フラグをまとめて消去することをお勧めします。
これも私を困惑させている他の何かです...私が写真を撮るとき、imageOrientation
は3に設定されています。私の回避策コードはこれを実現してユーザーが気付かないようにそれを裏返すのに十分賢いです。さらに、画像をライブラリに保存するコードはこれを認識し、反転してから保存して、カメラロールに正しく表示されるようにします。
そのコードは次のようになります。
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
この新しく保存された画像をアプリにロードすると、これimageOrientation
は0になります。これはまさに私が見たいものであり、回転の回避策を実行する必要もありません(注:カメラで撮影した画像ではなく、インターネットから画像をロードする場合、imageOrientation
は常に0であるため、完全な動作になります)。imageOrientation
何らかの理由で、私の保存コードはこのフラグを一掃しているようです。ユーザーが写真を撮ってアプリに追加するとすぐに、そのコードを盗んでそれを使用してimageOrientationを消去したいと思っていましたが、機能していないようです。UIImageWriteToSavedPhotosAlbum
何か特別なことをしimageOrientation
ますか?
imageOrientation
この問題の最善の解決策は、ユーザーが画像の撮影を終えたらすぐに吹き飛ばすことです。Appleはある理由で回転動作を行っていると思いますよね?何人かの人々はこれがアップルの欠陥であると提案しました。
(...まだ迷っていない場合...注2:横向きの写真を撮ると、インターネットから撮った写真と同じように、すべてが完璧に機能しているように見えます)
編集:
いくつかの画像とシナリオが実際にどのように見えるかを次に示します。これまでのコメントからすると、この奇妙な振る舞いは単なるiPhoneの振る舞いではなく、良いと思います。
これは私が携帯電話で撮った写真の写真です(正しい向きに注意してください)。写真を撮ったときの携帯電話とまったく同じように表示されます。
メールで送信した後のGmailの画像は次のようになります(Gmailで適切に処理されているようです)。
Windowsでのサムネイルとしての画像は次のようになります(適切に処理されていないようです)。
そして、Windowsフォトビューアーで開いたときの実際の画像は次のようになります(まだ適切に処理されていません)。
この質問に対するすべてのコメントの後、私が考えていることは次のとおりです... iPhoneは画像を取得し、「これを正しく表示するには、90度回転させる必要があります」と言います。この情報はEXIFデータに含まれます。(デフォルトで真っ直ぐに垂直にするのではなく、なぜ90度回転する必要があるのかわかりません)。ここから、GmailはそのEXIFデータを読み取って分析し、適切に表示するのに十分スマートです。ただし、WindowsはEXIFデータを読み取るほどスマートではないため、画像が不適切に表示されます。私の仮定は正しいですか?