[PHP-users 34512] Re: 特定画像のimagecopyresampled失敗について

a-nakamura a-nakamura @ accent-inc.jp
2009年 4月 10日 (金) 18:53:45 JST


ナカムラです。

> 柳本です。
> 
> WinXP PHP-5.2.5 Apache-2.2.11 の環境で試したところ
> 
> Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg,
> libjpeg: recoverable error: Corrupt JPEG data: 9 extraneous bytes before
> marker 0xd9 in hogehoge.php on line 2
> 
> Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]:
> 'hogehoge.jpg' is not a valid JPEG file in hogehoge.php on line 2
> 
> と出てきたのでEOIマーカー(FF D9)の手前9バイトを削ってみたところ、
> エラーが出なくなりました。
> そのカメラが不正なファイル吐いてるだけじゃないでしょうか・・・

ありがとうございます。
こちらでも、EOIマーカー前の9バイトを削って縮小を行ったところ、成功しました。
JPEGファイル自体が正しくない(GD的に)ので、imagecreatefromjpegでエラーを
吐いているのですね。

カメラが吐く画像データがまずい場合、PHP側ではどうしようもないですよね…
なまじっか他のアプリでは正常に見えるあたりがくせ者です…
バイナリで読み込んで、JPEGフォーマットを参照してそこから再構築すると
いうのもリスクが高そうな感じがします。

GDは思っていた以上にシビアに画像判定をするということがわかりました。
対策として、エラー時回避と判定強化を行おうと思います。

最終的にPHPの質問でなくなってしまい、申し訳ありませんでした。
ありがとうございました。

> 
> a-nakamura さんは書きました:
> > ナカムラです。
> > 
> > 特定画像のimagecopyresampledでの縮小で、問題が起き困っています。
> > 同じ問題に遭遇された方や、解決方法をお知りの方がいらっしゃいましたら、
> > お知恵をお貸しいただけると助かります。
> > 
> > 【内容】
> > 下記ソースで問題なく画像の縮小が行えるのですが、
> > あるデジカメ画像だけは縮小が行えず、できあがった画像が真っ黒という症状がおきています。
> > 他のJPEG画像は問題ないのですが、あるカメラで撮った画像のみ発生します。
> > ちなみに、$copy_img をimagecopyresampledせずにそのまま保存した場合は正常
> > に保存されます。
> > 
> > 【環境】
> > PHP Version 5.2.6
> > GD Version bundled (2.0.34 compatible) 
> > OS WindowsXp
> > 
> > 【ソース】
> > 動作:$filenameの画像を指定サイズに縮小する
> > 入力値:$filename=JPEG画像のファイルパス
> > ---------------------
> > //画像サイズ取得
> > list($in_w, $in_h) = getimagesize($filename);
> > 
> > //縮小画像サイズ
> > $out_w = 1280;
> > $out_h = 900;
> > 
> > //画像オープン
> > $copy_img = @imagecreatefromjpeg($filename);
> > if ($copy_img) {
> >   //縮小処理
> >   $tmp_img = imagecreatetruecolor($out_w, $out_h); 
> >   imagecopyresampled($tmp_img, $copy_img, 0, 0, 0, 0, $out_w, $out_h, $in_w, $in_h);
> >   //保存
> >   imagejpeg($tmp_img, $filename, 100);
> > }
> > ---------------------
> > 
> > imagecopyresampledを行わずに、$copy_imgをそのままimagejpegで
> > 保存しますと、正常に保存されます。
> > なので、imagecopyresampledになにかバグがあるのかと思って探したのですが
> > 見つけられませんでした。
> > 
> > 画像データは以下にアップロードしております。
> > http://www1.axfc.net/uploader/Img/so/42501.jpg
> > 
> > 撮影したカメラは、
> > VISTAQUEST VQ1005
> > で、ブラウザやビューアーや画像編集ソフトなどでは正常に表示されます。
> > GDの問題ではなく、単純にカメラデータの問題かもしれません。
> > ちなみに、同じカメラで撮った別の画像も同じ現象がおきています。
> > ネット上で、同じ機種のカメラで撮ったとおもわれる画像では縮小は成功して
> > いました。
> > 問題の根本はPHPにはないかもしれませんが、お知恵を拝借したいと思います。
> > よろしくお願いいたします。
> > 
> > _______________________________________________
> > PHP-users mailing list  PHP-users @ php.gr.jp
> > http://ml.php.gr.jp/mailman/listinfo/php-users
> > PHP初心者のためのページ - 質問する前にはこちらをお読みください
> > http://oldwww.php.gr.jp/php/novice.php3
> > 
> 
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3



PHP-users メーリングリストの案内