Obraz generowany przez GD w PHP Obraz nie może być wyświetlany, ponieważ zawiera błędy w Firefoksie
Podczas generowania obrazu za pomocą PHP, na przykład dodawania znaku wodnego do obrazu przechowywanego na serwerze, przy użyciu poniższego kodu lub podobnego z obrazem JPEG zamiast PNG, obraz może nie być generowany i zgłaszać błąd, widoczny bezpośrednio w przeglądarce Firefox, ale nie w Chrome.
Ten rodzaj kodu, pomimo pracy na niektórych serwerach, może teraz działać na innych, czasem z niejasnych powodów. W moim przypadku działało idealnie dobrze lokalnie, ale wyprodukowane poniżej błędu na serwerze internetowym, obraz nie może być wyświetlany, ponieważ zawiera błędy.
Problem może wynikać z kilku powodów: oto niektóre z nich:
- Dane wyjściowe zostały już wcześniej ustawione
- Prawdziwy błąd generowania obrazu
- Używany jest niewłaściwy typ obrazu
- Biblioteka obrazów nie jest zainstalowana
$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');
Dane wyjściowe zostały już wcześniej ustawione
Nawet jeśli nie celowo, może być na przykład na przykład, że inne poprzednie skrypty zawierały spacje na końcu – aby uniknąć tego błędu, upewnij się, że, jak zaleca PHP, nie zamykaj skryptów z tagiem końcowym PHP ?>
Następnie, przed użyciem funkcji nagłówka, użyj następującego kodu, aby upewnić się, że poprzednio ustawiony nagłówek został odrzucony
foreach (getallheaders() as $name => $value) {
header_remove($name);
}
A także ta funkcja, aby upewnić się, że nie zostały wygenerowane żadne dane wyjściowe przed nagłówkiem i obrazem
ob_end_clean();
Rozwiązało to problem w moim przypadku, a obraz został poprawnie wyświetlony ponownie:
Prawdziwy błąd generowania obrazu
W przypadku wygenerowania prawdziwego błędu podczas generowania obrazu, upewnij się, że PHP jest ustawione na wyświetlanie wszystkich możliwych rodzajów błędów i sprawdź odpowiednie dzienniki, aby móc je wyśledzić i rozwiązać.
Poniższy kod sprawi, że PHP zgłosi wszystkie błędy w dzienniku:
error_reporting(E_ALL);
ini_set('display_errors', '1');
Możesz wtedy dowiedzieć się, że zgłoszono pewne błędy, nawet jeśli nie pojawiły się w wyjściowym html, z powodu konfiguracji serwera.
Używany jest niewłaściwy typ obrazu
Upewnij się, że używane typy obrazów są poprawne, na przykład używając tego kodu, aby odróżnić png i jpeg.
Upewnij się także, że nagłówek jest poprawny w zależności od użytego wyjścia, w zależności od użytej funkcji generowania obrazu
//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');
Biblioteka obrazów nie jest zainstalowana
Aby upewnić się, że biblioteki obrazów są zainstalowane. Aby to zrobić, uruchom funkcję phpinfo (); w skrypcie i sprawdź dane wyjściowe dla następującej wartości związanej z PHP GD, biblioteki graficznej używanej przez funkcje takie jak imagepng ();
W przypadku braku pakietów, sposób rozwiązania zależy od konfiguracji lokalnej, poprzez dodanie pakietu za pomocą poleceń PEAR lub za pomocą wbudowanego rozwiązania hosta internetowego do instalacji pakietu.
Źródła
- 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