アップロードすると写真が回転してしまう理由
カメラを傾けても、写真そのものが回転することはほとんどありません。センサーは本体に固定されているので、どの向きで構えても同じ長方形を記録します。そしてカメラは、表示するときにどちら向きに回すべきかを示す向きのタグをファイルに書き込みます。その写真を表示するプログラムは、このタグに従うかどうかをそれぞれ自分で決めています。二つのプログラムの判断が食い違った瞬間、片方では写真が横倒しになります。
カメラは写真を回さず、覚え書きを残す
JPEGやHEICファイルのEXIFメタデータには Orientation という項目があり、定義された値は八つあります。ひとつはファイルがすでに正しい向きであることを示し、そのうち三つは90度、180度、270度の単純な回転、残りの四つは回転と左右反転を組み合わせたものです。
つまりスマートフォンで撮った縦向きの写真は、たいていの場合、横長の画像に「四分の一回転させて」という覚え書きが付いたものです。保存されているピクセルは本当に横倒しで、それを正しい向きで見せているビューアは、描画のたびにタグを適用しているのです。
覚え書きに従うプログラムと、無視するプログラム
ウェブブラウザーは通常の画像を表示するときにこのタグを適用し、いまではそれが既定の動作です。しかしファイルを生のピクセルまでデコードする処理は、横倒しのほうを見ることになります。その時点でタグは、ヘッダに取り残されたただの数値だからです。
アップロードで写真が回ってしまうのはこのためです。サイトはあなたのファイルを見たのではなく、作り直しました。縮小し、メタデータを取り除き、WebPに変換した結果には、もう覚え書きが付いていません。スクリプトでも同じです。画像ライブラリは頼まれたときだけ回転するので、先に向きを適用するよう明示しなければ、自動で直してはくれません。
二度回ってしまうという、実際にある失敗
逆向きの間違いも同じくらいよくあります。あるツールがピクセルを正しい向きに回したのに、タグは「四分の一回転させて」のまま残すと、そのタグに従う次のビューアが、すでに正しい写真をもう一度回します。結果として、今度は反対側へ倒れた写真ができます。
写真が90度ずれて出てきたときに役立つ問いは、二つのうちどちらが間違っているのか、です。ピクセルなのか、覚え書きなのか。両者は別々の情報であり、ひとつのファイルが自分自身と矛盾することがあります。
ファイルに書かれた縦横は、写真ではなくセンサーのもの
1200万画素のスマートフォンで撮った縦の写真は、自分を4032×3024、つまり横長だと申告します。ヘッダの寸法は保存されたピクセルを説明するものであり、画面の上でそれを縦にしているのは向きのタグです。
その数値から場所を確保するレイアウトや、描画する前に横長かどうかを判定する処理は、縦の写真で間違えます。ギャラリーの妙な位置に隙間ができる問題は、CSSではなくたいていこれです。
左右が反転した自撮りも同じ仕組み
八つの向きの値のうち四つは左右反転を含みます。前面カメラが鏡のようなプレビューを見せるために存在する値です。保存前にピクセルを反転させるアプリもあれば、センサーの画像をそのまま保存して反転をタグに記録するアプリもあります。
症状は文字に出ます。服のロゴや背後のホワイトボードが、あるプログラムでは裏返しに読め、別のプログラムでは正しく読めるなら、反転はピクセルではなくタグに入っているということです。
サムネイルが写真と食い違うことがある
EXIFには、撮影時にカメラが書き込んだ小さなサムネイルが一緒に入っていることがあります。ファイル管理ソフトや写真アプリは、全体を読むよりずっと速いので、しばしばそのサムネイルを表示します。
ところが編集ソフトが必ずそれを更新するとは限りません。切り抜きや回転で写真が変わったのに古いサムネイルが残ると、プレビューと開いたファイルが別のものを見せるという妙な状況になります。そして目立ちませんがより重要なのは、切り落としたはずの部分がサムネイルの中に残っていることがある、という点です。
誤読されようのない写真にするには
何かをする前に、まずタグを読んでください。回転の問題なのか反転の問題なのか、そもそもファイルが回してほしいと言っているのかどうかが、そこで分かります。タグはすでに正しい向きだと言っているのに写真が横倒しなら、上流の何かが元に戻せない形でピクセルを回してしまったということです。
長持ちする直し方は、回転をピクセルに焼き込んでからタグを正しい向きに設定するか、メタデータごと取り除いて、あとのどのプログラムにも回させないことです。アップロードした後ではなく、前に済ませてください。サイトがいったん作り直してメタデータを削いだあとでは、どう回すべきかを伝える覚え書きはもう残っていません。