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でも同じ結果が得られました。
誰かアドバイスがありますか?
PHP 5.6.2xには、EXIF機能にバグがあります(詳細については、バグ #72914 および #72819 を参照してください)。 EXIFデータを読み取ろうとすると、説明されているエラー(不正なIFDサイズ、IFD不良データ、その他)のいずれかが発生します。
現在(2016-11-21)、5.6ブランチで利用可能な修正プログラムはありません。ブランチ7でいくつかのテストが行われています。
IFDエラーをスローする関数をテストしてローカル修正を実装し、確認された場合は、スクリプトの実行中はEXIFが利用できないと仮定します。
(必要に応じてローダーにパッチを適用し、関数を「オーバーロード」して、破損を示す代わりにデフォルトのfalse/0/nullを返すことができます)
警告を無視する前に「@」を使用できます:@Image::open($path)->fixOrientation()->save($dest, $type, $quality);
インターネット上でこれについて不満を言う人が多い。おそらくいくつかのexifデータにエラーがあります。操作が希望どおりに機能している場合は、文書化して先に進みます。
実稼働環境では、警告を非表示にするのが最善です!
そこで、スクリプトの冒頭にある次の行のみで、エラー報告をエラーに変更しました。
error_reporting(E_ERROR);
また、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){
...
}