[解決済み] iOSの画像の向きがおかしい件
質問
この数週間、私は objective-c で画像を扱っていて、多くの奇妙な動作に気づきました。 まず、他の多くの人々と同様に、カメラで撮影した (または他の人のカメラで撮影して私に MMS で送信した) 画像が 90 度回転してしまうという問題が発生しました。 一体なぜこんなことが起こるのか、よくわかりませんでした(そのため 私の質問 で撮った (または他のカメラで撮って私に 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 の欠陥であると示唆しました。
(...もし、まだ迷っていないなら...) Note2です。 横向きの写真を撮ると、インターネットから撮った写真と同じように、すべてが完璧に動作するようです)
EDIT
実際にどのような画像やシナリオがあるのかを紹介します。 これまでのコメントから、この奇妙な動作は iPhone だけの動作ではなさそうで、それは良いことだと思います。
これは私の携帯電話で撮影した写真です (適切な方向に注意してください)。写真をスナップしたとき、私の携帯電話で撮影したのとまったく同じように表示されます。
自分宛にメールした後、Gmailで画像を見るとこんな感じです(Gmailではちゃんと処理されているようです)。
Windowsで画像をサムネイルにするとこんな感じです(うまく処理できていないようです)。
そして、実際の画像をWindowsフォトビューアで開くとこんな感じです(まだうまく処理できていません)。
この質問に対するすべてのコメントの後、私が考えていることは次のとおりです...。iPhone は画像を受け取り、「これを正しく表示するには、90 度回転させる必要があります」と言います。 この情報は、EXIFデータの中にあるはずです。 (なぜ90度回転させる必要があるのかは分かりませんが、デフォルトでは垂直のままです)。 ここから、Gmailは十分に賢く、そのEXIFデータを読み込んで分析し、適切に表示することができます。 しかし、Windowsは、EXIFデータを読み取るほど賢くないので、画像を表示します。 不適切に . 私の仮定は正しいですか?
どのように解決するのですか?
私はそれをR&Dして、すべての画像ファイルは、メタデータのプロパティを持っていることを発見しました。メタデータが画像の向きを指定している場合、Mac 以外の OS では一般に無視されます。撮影された画像のほとんどは、メタデータのプロパティが直角に設定されています。そのため、Macでは90度回転した形で表示されます。Windows OSでは、同じ画像を正しく表示することができます。
より詳細な情報は、こちらの回答をご覧ください。 http://graphicssoft.about.com/od/digitalphotography/f/sideways-pictures.htm
画像の exif を読み取るには、ここをクリックしてください。 http://www.exifviewer.org/ または http://regex.info/exif.cgi または http://www.addictivetips.com/internet-tips/view-complete-exif-metadata-information-of-any-jpeg-image-online/
関連
-
[解決済み] Xcodeエラー "Could not find Developer Disk Image" が発生する。
-
[解決済み] トランスポートセキュリティがクリアテキストのHTTPをブロックしています。
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み】iOSアプリの名前を変更する方法は?
-
[解決済み】iOS UIImagePickerControllerの結果、アップロード後に画像の向きが変わる。
-
[解決済み] UIImage。リサイズ、そしてクロップ
-
[解決済み] UITableViewHeaderFooterView。背景色を変更できない
-
[解決済み] 円形のカスタムUIViewの描き方 - iPhoneアプリ
-
[解決済み] iPhoneシミュレーターの位置情報
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Cocoapodsの使用時にXcodeの警告を無視する
-
[解決済み】iOS UIImagePickerControllerの結果、アップロード後に画像の向きが変わる。
-
[解決済み] iOSシミュレータでファイルシステムを確認する方法はありますか?
-
[解決済み] iOS UITableViewのHeaderView(セクションヘッダーではない)を追加する
-
[解決済み] モバイルSafari(iPhone)でテキストエリアのインナーシャドウを除去する
-
[解決済み] Xcode 4.2 - '...' の宣言は、この関数の外では表示されません 警告
-
[解決済み] エラー : サービスは無効です
-
[解決済み] CALayer setNeedsDisplayInRect:] の暗黙のアニメーションを無効にする。
-
[解決済み] Mac OS Xのスタティック・ライブラリ(.a)のターゲット・アーキテクチャはどのように決定するのですか?
-
[解決済み] UIScrollViewをコンテンツに合わせて自動サイズ調整する方法