[PHP]Unsupported marker type 0x03 JPEG画像の処理中に

Read More

PHPで作ったバッチファイルをコマンドラインから実行していたら
Unsupported marker type 0x03というメッセージが出た。



んー、なんだこれ??
実行したコマンドライン上に出力されてんだけど。

サポートされていない…マークタイプ…0x03…?


メッセージが出力されていた部分を特定していくと、
imagecreatefromstring()というPHP関数だったことがわかった。
ということは「該当の画像ファイルの形式がサポートされていない形式」ということなのか?


まあもう少し調べてみるとしよう。



--
まずはその2つのワードでググってみた。
しかし該当する記事は思うようにHITしなかった…

ひょっとしてめずらしいモノなのか?


とか考えていたが、
コードをよく見るとimagecreatefromstring()の関数に@演算子を付与しているではないか。



試しに@を外して再度コマンドラインから実行してみた。
すると今度は以下のようなものが取れた。

Notice: imagecreatefromstring(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: 307 extraneous bytes
before marker 0x03
 in {file_path} on line 41

Warning: imagecreatefromstring(): gd-jpeg: JPEG library reports unrecoverable error:  in {file_path} on line 41
Unsupported marker type 0x03

Warning: imagecreatefromstring(): Passed data is not in 'JPEG' format in {file_path} on line 41

Warning: imagecreatefromstring(): Couldn't create GD Image Stream out of Data in {file_path} on line 41



こっちのワードを使ってググったら今度はそれっぽい記事がHITした。

■imagecreatefromjpeg()で「marker 0xd9」エラーが出る問題について | colori
https://colo-ri.jp/develop/2013/02/imagecreatefromjpeg-marker-0xd9-error.html


これによると、
「画像ファイル中の0x03マーカーより前の307バイト部分にゴミ情報があります」ということのようだ。
要はJPEG画像が壊れてるらしい。

なるほどJPEGファイルの破損による出力だったのかー


厳密にはNoticeとWarningなのでエラーではないな。
実際try catchではキャッチできなかったし。
エラーです。

まあひとまず原因がわかって安心した。



--
念のため該当ファイルをWindows標準のビューアで開いてみた。
開けない。

なるほど、壊れたファイルのようだ。



さらに念のため別の調査ツールでも該当ファイルを調べてみた。


おお、なんかエラーが出てる。


あと【Photoshop 画質5 小】とかいう文字が見えるのできっとPhotoshopで編集したファイルなんだろうな。
まあなんにせよ原因がある程度絞れてよかった。



--
ちなみに「Unsupported marker type 0x03」の出力が確認できたのはコマンドプロンプトのみで、
ブラウザでやるとこの文字は出力されていなかった。
またコマンドプロンプト上のこの出力はimagecreatefromstring()に@演算子を付けたときのみに確認することができた。

@を外すとNoticeとWarningが発生するのはコマンドもブラウザも同じだった。