Je travaille sur une application où je corrige l'orientation (si elle est présente) des fichiers JPEG téléchargés à partir d'un compartiment AWS.
Ici vous pouvez vérifier que cette image a une section Exif Rotation.
Je télécharge l'image avec
file_put_contents('/local/path/to/file', file_get_contents('/path/to/url/image'));
Et après avoir essayé de corriger l’orientation à travers le Gregwar Image library .
Image::open($path)->fixOrientation()->save($dest, $type, $quality);
J'ai essayé avec plusieurs images et je reçois toujours le message
Warning: exif_read_data('/local/path/to/file'): Illegal IFD size
Je pensais que c’était un problème lié à la récupération des images, mais j’ai aussi essayé avec cUrl et fopen avec le même résultat.
Quelqu'un a des conseils?
PHP 5.6.2x a un bogue avec sa capacité EXIF (voir bogue # 72914 ainsi que # 72819 pour plus d’informations). Toute tentative de lecture de données EXIF entraînera l’une des erreurs décrites (taille IFD non autorisée, données incorrectes IFD, autre).
Pour l'instant (2016-11-21), il n'y a pas de correctif disponible pour la branche 5.6. Des tests sont en cours dans la branche 7.
Implémentez un correctif local en testant la fonction générant des erreurs IFD. Lorsque cela est confirmé, supposez que EXIF n'est pas disponible pendant toute la durée du script.
(Vous pouvez le patcher dans le chargeur si vous le souhaitez et «surcharger» les fonctions pour renvoyer false par défaut/0/null à la place pour indiquer un bris.)
Vous pouvez utiliser un "@" avant pour ignorer les avertissements: @Image::open($path)->fixOrientation()->save($dest, $type, $quality);
Cela fait beaucoup de gens se plaindre à ce sujet sur Internet. Probablement des données exif avec erreur. Si votre opération fonctionne comme vous le souhaitez, il suffit de la documenter et de passer à autre chose.
J'ai également rencontré ce problème avec exif_get_data. Je peux gérer les images sur mon hôte local (PHP 5.4.15), mais sur mon hébergeur (PHP 8.6.22), l'erreur 'taille IFD illégale' alors que j'avais déjà essayé la méthode d'alerte Ignorer "@" que sur l'hôte Web (que ce soit en raison d'une version ou d'une installation différente), exif_get_data levait en réalité une exception plutôt que d'émettre un avertissement. J'utilise les données exif pour réorienter l'image si elle a fait l'objet d'une rotation. Par conséquent, si les données exif sont défectueuses ou non présentes, je les ignore et ne fais rien, voici l'extrait de code:
try {
$exif = exif_read_data($filePath);
}
catch (Exception $exp) {
$exif = false;
}
if ($exif){
...
}
Dans environnement de production , le mieux est encore de cacher les avertissements!
J'ai donc changé le rapport d'erreur à ERRORS avec la ligne suivante au début de mon script:
error_reporting(E_ERROR);