PHP 画像の回転とヘッダ情報の関連:Orientationとimagerotate()とimagejpeg()

2018/05/16

経緯

90度回転した状態の写真を元の状態にしたい。
※プログラム側で画像を回転させて、向きを統一したい

でも、画像が回転しない。

基本的に下記の流れ

1.画像のヘッダ情報(?)の「Orientation」を取得
2.「Orientation」を元に画像の向き(90度回転している等)を取得
3.「imagerotate()」で画像を逆回転させる
4.「imagejpeg()」等で「3」をファイルに出力

画像が回転しない問題発生

「4」の結果の画像を見ると・・・画像が回転していない・・・という状況。

「4」の結果の画像から「Orientation」を見ると・・・無い。
「1」の画像には「Orientation」は・・・ある。
画像ファイルによっては「1」のときから「Orientation」が無いってヤツもあるだろう。

ひとまず分かったのは「4」の「imagejpeg()」をすると「Orientation」は消える。

「Orientation」から角度取得

「1」の画像から「Orientation」は取得できるから画像の向き(角度)も取得出来ている・・・。

でも「imagerotate()」して「imagejpeg()」すると回転しない状況に陥る。
しかも「imagejpeg()」すると「Orientation」が消えるから何が起きたのかは不明。

「imagerotate()」と「imagejpeg()」の戻値

「imagerotate()」で「失敗」したら「false」が返ってくるという・・・「false」は返ってこない。
つまり、「imagerotate()」は「成功」したと推測。

「imagejpeg()」は成功・失敗で「true / false」が返ってくるという・・・「false」が返ってくる。
でも画像はファイル出力されている。
「成功」したから画像が出力されたのか、画像出力とは異なる箇所で問題があったから「false」となったのかは不明。
※やり方を何か間違ったかもしれない・・・。

「Orientation」亡き後、さらに回転

「Orientation」が消えるってコトを当初、気付いていなかったので、何度も「imagerotate()→imagejpeg()」を実行。
初回は回転しないけど、何度か「imagerotate()→imagejpeg()」を実行してたら回転していた。

何度か調べると「初回は失敗、2回目以降は成功」というコトに気付いた。
さらに「Orientation」が消えているってコトにも気付いた。

推測しての対策

原因が分からないので・・・推測して対策を立てることに。

推測1

「Orientation」があると「imagerotate()→imagejpeg()」をしても回転しない

「Orientation」をどうやって削除するかが分からないので・・・2回することにした。

1.画像のヘッダ情報(?)の「Orientation」を取得
2.「Orientation」を元に角度(90度回転している等)を取得
3.「imagerotate()」で「0度」で回転させる
4.「imagejpeg()」等で「3」をファイルに出力
5.「4」を「imagerotate()」で逆回転させる:角度は「2」
6.「imagejpeg()」等で「5」をファイルに出力

結果・・・意図していない角度に回転。
何がどうなったのかが分からない・・・。

しょうがないので上記の「4」で止めて確認。
すると・・・正しい角度になってくれていた。

推測2(解決(仮))

推測するも何も・・・原因不明だけど解決してるので・・・下記の流れ。

1.「imagerotate()」で「0度」で回転させる
2.「imagejpeg()」等で「2」をファイルに出力

色々と試して確認しないといけないけど・・・ひとまず解決。
でも原因不明だし、色々と試していないので「解決(仮)」とする。

Orientationの値と角度

基本、1・3・6・8だけ気にすれば良いと思う。

Orientationの値 回転
1 回転無し
2 左右反転
3 180°回転
4 上下反転
5 時計回りに90°回転した後、左右反転
6 時計回りに90°回転
7 反時計回りに90°回転した後、左右反転
8 反時計回りに90°回転

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい