PHP 画像の回転とヘッダ情報の関連:Orientationとimagerotate()とimagejpeg()
経緯
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°回転 |