web-dev-qa-db-ja.com

PHP exif_read_data不正なIFDサイズ

AWSバケットからダウンロードしたjpegファイルの向き(存在する場合)を修正するアプリケーションに取り組んでいます。

ここ この画像にexif Rotationセクションがあることを確認できます。

画像をダウンロードします

file_put_contents('/local/path/to/file', file_get_contents('/path/to/url/image'));

そして、 Gregwar Image library を使用して向きを修正しようとした後。

Image::open($path)->fixOrientation()->save($dest, $type, $quality);

いくつかの画像を試してみましたが、常にメッセージが表示されます

Warning: exif_read_data('/local/path/to/file'): Illegal IFD size

これは画像の取得方法に関連する問題だと思っていましたが、cUrlとfopenでも同じ結果が得られました。

誰かアドバイスがありますか?

16
stuzzo

PHP 5.6.2xには、EXIF機能にバグがあります(詳細については、バグ #72914 および #72819 を参照してください)。 EXIFデータを読み取ろうとすると、説明されているエラー(不正なIFDサイズ、IFD不良データ、その他)のいずれかが発生します。

現在(2016-11-21)、5.6ブランチで利用可能な修正プログラムはありません。ブランチ7でいくつかのテストが行​​われています。

IFDエラーをスローする関数をテストしてローカル修正を実装し、確認された場合は、スクリプトの実行中はEXIFが利用できないと仮定します。

(必要に応じてローダーにパッチを適用し、関数を「オーバーロード」して、破損を示す代わりにデフォルトのfalse/0/nullを返すことができます)

4
Kadigan.KSB

警告を無視する前に「@」を使用できます:@Image::open($path)->fixOrientation()->save($dest, $type, $quality);

インターネット上でこれについて不満を言う人が多い。おそらくいくつかのexifデータにエラーがあります。操作が希望どおりに機能している場合は、文書化して先に進みます。

3
Felippe Duarte

実稼働環境では、警告を非表示にするのが最善です!

そこで、スクリプトの冒頭にある次の行のみで、エラー報告をエラーに変更しました。

error_reporting(E_ERROR);
1
Meloman

また、exif_get_dataを使用してこの問題に遭遇しました。 localhost(PHP v5.4.15)で画像を処理できますが、Webホスト(PHP v5.6.22)では、警告メソッド「@」を無視しても「不正なIFDサイズ」というエラーが表示されます。 (バージョンやインストールが異なるため)Webホストで、exif_get_dataが警告を発行するのではなく、実際に例外をスローしていることがわかりました。画像が回転している場合、exifデータを使用して画像の向きを変更しているため、exifデータに問題があるか存在しない場合、それを無視して何もしません。コードスニペットを次に示します。

     try {
        $exif = exif_read_data($filePath);
     }
     catch (Exception $exp) {
        $exif = false;
     }
     if ($exif){
        ...
     }
1
Arfon