PHPは雑!というのは最早当たり前の話ですが、今回5時間以上ハマったので忘れないよう備忘録をつけようと思います。
目次
GDでの画像処理
GDで画像処理をしなければいけない場面がありました。
スマホから画像をアップロード、出力すると画像の向きがおかしくなるというものでEXIFのOrientationによって画像の回転処理が必要になりました。
画像回転後さらに、既存の画像処理が走るためファイルポインタ(リソースIDとPHPでは呼ぶらしい)を解放せず保持しておかなければなりませんでした。
そもそもImageCreateFromJPEG()で、Orientationを読み取って回転させればこの回転処理は全く必要ないのですが、仕方ないので処理することにします。
で、Orientationですがこのサイトによると反転も必要とのこと。
反転処理はimageflip()、回転処理はimagerotate()と別々の関数になるそうですが、これらの返り値はそれぞれ違います。
imageflip()
成功した場合に true を、失敗した場合に false を返します。
imagerotate()
回転させた画像のリソースを返します。失敗した場合に false を返します。
うーん、これ。よくある話ではありますが、ほんとよくマニュアル読まないとダメですね。
上記サイトで$im = imageflip($im, $mode);としてますがこれは間違いで、返り値はTrue か Falseなので、$imとして出力もできないということです。
imageflip($im , $mode);を実行したら、加工されたものが自動的に$imに入ります。
一方で、imagerotate()はリソースが返却されるので、$im = imagerotate($im , $hogehoge , 0);のようにしないといけません。
文言が違う
リソースとリソースIDという文言がマニュアル上出ていました。
imagerotate()は返り値が「リソース」と明記されています。
ここで、imagecreatefromjpeg()のマニュアルを見ます。
成功した場合に画像リソース ID、エラー時に false を返します。
返り値が「リソースID」
しかし、imagecreatefromjpeg ( string $filename ) : resourceとなっているのでリソースが返って来ていますが、、、違うものと思ってしまうのでちょっと焦りますよね。
で、信用ならないのでis_resorce()で確認しました。
imagecreatefromjpegで読み込んだ画像に対してis_resorce()、imagerotate()で返ってきたものに対してis_resorce()
両方ちゃんとTrueで返ってきました。やめてほしい。
日本語版の翻訳ミスかなと思い英語版も確認しましたが、英語版も同様の模様。。
imagecreatefromjpeg()
Returns an image resource identifier on success, false on errors.
imagerotate()
Returns an image resource for the rotated image, or false on failure.
・・・
これはあえてこう書いているのか、、is_resorce()でTrueになるのだから両者返り値はリソースとしてくれたほうがわかりやすいと思うのは私だけでしょうか。
PHPさん、似たような処理で返り値が違うのは百歩譲っていいので、このマニュアルの文言変えませんか?
ヒットしたサイトは間違ったこと書いてるし、
立ち止まってマニュアルをよく読んでももっと混乱して理解するのに時間がかかった一日でした。皆さんもお気を付けください。