Код, использующий GD, заканчивался ошибкой, что «изображение не может быть отображено»

0

Мой код выглядит следующим образом:

<?php
session_start();
$img=imagecreatetruecolor(150,50);

$white=imagecolorallocate($img,255,255,255);
$black=imagecolorallocate($img,0,0,0);
$red=imagecolorallocate($img,255,0,0);
$pink=imagecolorallocate($img,200,0,150);
$grey=imagecolorallocate($img,150,150,150);
$blue=imagecolorallocate($img,0,204,255);
$redd=imagecolorallocate($img, 153, 0,0);
function randomString($length){
    $chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ023456789";
    srand((double)microtime()*1000000);
    $str="";
    while($i<=$length){
        $num=rand() % 33;
        $tmp=substr($chars,$num,1);
        $str.=$tmp;
        $i++;
    }
    return $str;
}
for($i=0;$i<=rand(1,5);$i++)
{
    $color=(rand(1,2)==1)? $grey:$white;
    imageline($img, rand(5,50),rand(5,50),rand(50,150) , rand(5,50), $color);
}
$ran=randomString(rand(3,6));
$_SESSION['captcha']=$ran;
imagefill($img,0,0,$redd);
imagettftext($img,14,7,23,27,$black,"fonts/times_new_yorker.ttf",$ran);
imagettftext($img,16,10,18,30,$white,"fonts/times_new_yorker.ttf",$ran);
header("Content-type:image/png");
imagepng($img);
imagedestroy($img);

?>

Вчера это работало так, как ожидалось. Но теперь Firefox показывает сообщение:

Это изображение невозможно отобразить, поскольку оно содержит ошибку.

Когда я искал какие-либо решения, кажется, все говорят о возможности включения GD. Но в моем коде GD включен, и этот код отлично работал до сегодняшнего утра.

Может ли кто-нибудь помочь мне получить решение для этого?

  • 1
    Пожалуйста, прокомментируйте строку, где вы меняете заголовок. Это позволит вам увидеть РЕАЛЬНУЮ ошибку php. Если он есть, мы бы с удовольствием его увидели :)
  • 0
    Я немного отредактировал ваш вопрос, с некоторыми изменениями в уценке и правописании. Пожалуйста, рассмотрите возможность добавления некоторых деталей: это просто Firefox? Какова точная ошибка? Что произойдет, если вы удалите части своего кода, то есть, какое минимальное повторение для этой проблемы? Есть ли у вас ссылки на тех, кто говорит о «включении GD»?
Показать ещё 1 комментарий
Теги:
gd

1 ответ

1
Лучший ответ

Изображение не может быть отображено, потому что PHP сообщает об ошибке, а header('Content-Type: image/png') сообщает ему, чтобы страница отображалась как изображение.

Чтобы увидеть эту ошибку, вы должны удалить следующую часть:

header("Content-type:image/png");
imagepng($img);
imagedestroy($img);

или еще лучше, окружайте его с помощью if (!isset($_GET['debug'])). Таким образом, вы можете добавить ?debug=1 к своему URL-адресу и просмотреть все возможные ошибки PHP, в то время как изображение все еще отображается нормально.

Существует несколько возможных решений, почему ваш код может перестать работать, не меняя его. Я предполагаю, что вы каким-то образом вмешались в окружающую среду.

  • session_start() должен хранить данные сеанса в каталоге на локальном диске. Имеет ли ваш PHP доступ к этому каталогу?
  • fonts/times_new_yorker.ttf могут исчезнуть.
  • Вы могли бы переместить скрипт на Linux-машину, где дело обстоит буквами. Вы уверены, что путь к шрифту не должен содержать буквы верхнего регистра в любом месте?

Кроме того, всего пару советов:

  • Вам не нужно вызывать srand(), он инициализируется автоматически. (Я предполагаю, что вы исходите из фона C/C++).
  • Вместо использования rand() вы должны использовать mt_rand() поскольку он быстрее и обеспечивает лучшую случайность.
  • Вместо использования магических чисел вы должны использовать содержательные выражения (например, заменить % 33 на % strlen($chars)).
  • Поскольку вы, похоже, отображаете капчу, считаете совпадение 0 и O, 1 и l одним и тем же "символом", чтобы были прощены разумные ошибки пользователя. (Простите, если вы это сделаете.)
  • 0
    Большое спасибо за сохранение некоторых для воспроизведения для этой проблемы ................. Хорошая новость: "Моя проблема решена" ........... Я действительно спешу завершить проект, очень расстроенный из-за этой ошибки, это заняло у меня много времени. Меня раздражало то, что вчера это работало хорошо, внезапные перемены мне очень сильно повредили ». этот код "'" $ я не инициализирован. Не знаю, почему я забыл это, может быть из-за спешки ............ Ну, спасибо, друзья ... Найдите это, комментируя часть заголовка ..... Новый урок для меня ..
  • 0
    Спасибо за ваши советы .............. Серьезно рассмотрим это ..
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню