Image générée par PHP GD L’image ne peut pas être affichée car elle contient des erreurs dans Firefox
Lors de la génération d’une image avec PHP, par exemple en ajoutant un filigrane à une image stockée sur le serveur, en utilisant le code ci-dessous, ou similaire avec JPEG au lieu de PNG, l’image peut ne pas être générée et afficher une erreur directement visible sur Firefox. sur Chrome.
Ce type de code, bien qu’il fonctionne sur certains serveurs, peut maintenant fonctionner sur d’autres, parfois pour des raisons obscures. Dans mon cas, cela fonctionne parfaitement bien localement, mais produit en dessous de l’erreur sur le serveur internet, l’image ne peut pas être affichée car elle contient des erreurs.
Le problème peut venir de plusieurs raisons, en voici quelques unes:
- Une sortie a déjà été définie précédemment
- Une véritable erreur de génération d’image
- Le mauvais type d’image est utilisé
- La bibliothèque d’images n’est pas installée
$stamp = imagecreatefrompng('watermark.png');
if(!$im = imagecreatefrompng('image.png')) die('Error generating image');
$marge_right = $marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
$copyimage = imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
header('Content-type: image/png');
if(!imagepng($im)) die('Error generating image');
if(!imagedestroy($im)) die('Error generating image');
if(!imagedestroy($stamp)) die('Error generating image');
Une sortie a déjà été définie précédemment
Même si ce n’est pas intentionnel, cela pourrait être le cas par exemple que d’autres scripts contenaient des espaces à la fin – pour éviter cette erreur, assurez-vous, comme le recommande PHP, de ne pas fermer les scripts avec PHP end tag ?>
Ensuite, avant d’utiliser la fonction d’en-tête, utilisez le code suivant pour vous assurer que tout en-tête précédemment défini est ignoré
foreach (getallheaders() as $name => $value) {
header_remove($name);
}
Et aussi cette fonction pour s’assurer qu’aucune sortie n’a été générée avant l’en-tête et l’image
ob_end_clean();
Cela a résolu le problème dans mon cas, et l’image a été correctement affichée à nouveau:
Une véritable erreur de génération d’image
Au cas où une erreur réelle se produirait lors de la génération de l’image, assurez-vous que PHP est configuré pour afficher toutes les erreurs possibles, et vérifiez les logs correspondants, afin de pouvoir le localiser et le résoudre.
Le code suivant permettra à PHP de signaler toutes les erreurs dans le journal:
error_reporting(E_ALL);
ini_set('display_errors', '1');
Vous pourriez alors découvrir que certaines erreurs ont été signalées, même si elles n’apparaissaient pas dans le fichier html de sortie, en raison de la configuration du serveur.
Le mauvais type d’image est utilisé
Assurez-vous que les types d’image que vous utilisez sont corrects, par exemple en utilisant ce code pour faire la distinction entre png et jpeg.
Assurez-vous également que l’en-tête est correct en fonction de la sortie utilisée, en fonction de la fonction de génération d’image utilisée
//to generate png image
header('Content-type: image/png');
if(!imagepng($im)) die('Error generating image');
//to generate jpeg image
header('Content-type: image/jpeg');
if(!imagejpeg($im)) die('Error generating image');
La bibliothèque d’images n’est pas installée
Pour vous assurer que les bibliothèques d’images sont installées. Pour ce faire, exécutez la fonction phpinfo (); dans un script, et vérifiez la sortie pour la valeur suivante liée à PHP GD, la bibliothèque graphique qui est utilisée par des fonctions comme imagepng ();
Dans le cas où les paquets sont manquants, la façon de les résoudre dépend de votre configuration locale, soit en ajoutant le paquet en utilisant les commandes PEAR, soit en utilisant la solution intégrée de l’hôte web pour l’installation du paquet.
Sources
- PHP : adding watermarks to images using alpha channels manual – PHP.net
- PHP : imagepng manual – PHP.net
- PHP : ob_end_clean manual – PHP.net
- PHP : PHP tags – PHP.net
- Debugging : how to get useful error messages in PHP ? – stackoverflow.com
- Need PHP/Pear extension GD – linuxquestions.org
- Image dynamically displayed using PHP functions – www.wcifly.com