過去数週間、私は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が理由でローテーション動作を行ったと思いますよね?これはAppleの欠陥であると数人の人が提案しました。
(...まだ迷っていない場合...注2:横向きの写真を撮ると、インターネットから撮った写真と同じように、すべてが完璧に機能しているように見えます)
編集:
ここに、いくつかの画像とシナリオが実際にどのように見えるかを示します。これまでのコメントに基づくと、この奇妙な動作は単なるiPhoneの動作ではないようです。
これは私が携帯電話で撮った写真の写真です(正しい向きに注意してください)。写真をスナップしたときの携帯電話とまったく同じように表示されます。
自分にメールした後のGmailの画像は次のとおりです(Gmailで適切に処理されているようです)。
ウィンドウにサムネイルとして表示される画像は次のとおりです(適切に処理されているようには見えません)。
Windowsフォトビューアーで開いたときの実際の画像は次のとおりです(まだ適切に処理されていません)。
この質問に対するすべてのコメントの後に、私が考えているのはこれです... iPhoneは画像を取得し、「これを適切に表示するには、90度回転させる必要があります」と言います。この情報はEXIFデータに含まれます。(なぜデフォルトでは真っ直ぐな垂直ではなく90度回転する必要があるのか、私にはわかりません)。ここから、GmailはそのEXIFデータを読み取って分析し、適切に表示するのに十分スマートです。ただし、Windowsは、EXIFデータを読み取るほどスマートではないため、画像が正しく表示されません。私の仮定は正しいですか?