Проблема с заголовком PHP GD - PullRequest
0 голосов
/ 16 сентября 2010

Пару месяцев назад я включил GD на локальном хосте, чтобы немного поиграть с ним, использовал различные сценарии, найденные в Интернете, чтобы лучше понять, что он делает, все хорошо и хорошо.

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

Например, это был первый скрипт, который я когда-либо пробовал:

$my_img = imagecreate( 200, 80 );
$background = imagecolorallocate( $my_img, 0, 0, 255 );
$text_colour = imagecolorallocate( $my_img, 255, 255, 0 );
$line_colour = imagecolorallocate( $my_img, 128, 255, 0 );
imagestring( $my_img, 4, 30, 25, "thesitewizard.com",
$text_colour );
imagesetthickness ( $my_img, 5 );
imageline( $my_img, 30, 45, 165, 45, $line_colour );

header( "Content-type: image/png" );
imagepng( $my_img );
imagecolordeallocate( $line_color );
imagecolordeallocate( $text_color );
imagecolordeallocate( $background );
imagedestroy( $my_img );

Источник

Тогда работал нормально, теперь, когда я запускаю его, я получаю это:

Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные (вывод начался с H: \ xampp \ htdocs \ tests \ script.php: 1) в H: \ xampp \ htdocs \ tests \ script.php в строке 11 PNG IHDR P ! # PLTE M ) B IDATH 1 0EA N : 8QJNdZ ��! � ���k�Z⊜���k��g�˕��|K$�M��|)��$ů8DfRQB���-��[I��?tźR�+���%�"��Ut)(�K�@dF�e�zKF9&�g|C7i��d?��\G�Y � �3y�Ƌ�_�%�����IEND�B

Предупреждение: неверный счетчик параметров для imagecolordeallocate () в строке H: \ xampp \ htdocs \ tests \ script.php в строке 13

Предупреждение: неверный счетчик параметров для imagecolordeallocate () в H: \ xampp \ htdocs \ tests \ script.php в строке 14

Предупреждение: неверный счетчик параметров для imagecolordeallocate () в H: \ xampp \ htdocs \ tests \ script.php в строке 15

То же самое для второго скрипта, который я когда-либо пробовал:

// create a 200*200 image
$img = imagecreatetruecolor(200, 200);

// allocate some colors
$white = imagecolorallocate($img, 255, 255, 255);
$red   = imagecolorallocate($img, 255,   0,   0);
$green = imagecolorallocate($img,   0, 255,   0);
$blue  = imagecolorallocate($img,   0,   0, 255);

// draw the head
imagearc($img, 100, 100, 200, 200,  0, 360, $white);
// mouth
imagearc($img, 100, 100, 150, 150, 25, 155, $red);
// left and then the right eye
imagearc($img,  60,  75,  50,  50,  0, 360, $green);
imagearc($img, 140,  75,  50,  50,  0, 360, $blue);

// output image in the browser
header("Content-type: image/png");
imagepng($img);

// free memory
imagedestroy($img);

Источник

Что теперь выводит:

Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные (вывод начался с H: \ xampp \ htdocs \ tests \ script.php: 1) в H: \ xampp \ htdocs \ tests \ script.php в строке 22 PNG IHDR ": 9 gIDATx v H a < 4Ƹ ܕ : / { v } ZC (~ ҆Uj1jƖ ~) у [xJW + / nq9) eɽ? NQ% Pfgf s + I ޽; I l 2s -R u 9 b }  H d B v R 2 Kr h u v 8 y U | ^ O T ' : I * R! r % Z $ _ ?L ʴVd W U ' tk 2 \ XA 5 s ϔGL0 Q : 0O | M W j ܼ C U} ՚ FŹǂ UO ֝ ά OW z k N " 1F " ls {r ? @ / v ZSw1i ? I 8 ] C A xN? Xw 죙 ۮ 9 - & C h N "r B ! ��j�Ǹ�_"ե>�Љ�u��q����9ɫ�T��5�s0*���*xݣ> �X!�w�����R�u �~�-O7�"�� <��·v���K��i�;�Dv��c��P�q��h,)~C��w��� 9 ����q�5���v&h,��� & Kx \ '7LF. -B �Ƃ�ğ'� ^Ajw�1�X0��X"�*��z�.�&"+|{��v/a+0�1o�i0G!l�~�o�+_�� �_��� 8�r|��F���k��!������}>��Ǟ7Xbb=�]�Rd��1��f�d�}�Nـ�k�ۉ���[5�k��6��y��I��jc�~/��˭N�ڍ�� �s�����4L�X0Ac��4L�X0����;�a�Ƃ &h,��� осел% кв, Nh, �Ƃ1���=�V�h,��� , | c ? L, �Ƃn�pϮs<&��ơ"��bq2�tX��w�0��h��bb�^����4�¿�+���; �p1�\�_����ܶ�\o�Z�$����Yxz˟Q�O:�� " 8 Ov | 78 W Ը Z X (p \ =  ? Y :A: N ޚ 4 {~ b [S $ UO ᡷ a = [ = ֩ Z_6 w | } CBf " K $$ { 3 E ^ vMϨc $ ڻ f Pu + W + ; { L 6D ލ w G J Tcrln_JE] | т} ап> Խ IENDB`

Однако третий скрипт, который я когда-либо пробовал, все еще работает:

// read the post data
    $data = array('100','200','300','400','500','350','270');
    $x_fld = array('Sun','Mon','Tue','Wen','Thu','Fir','Sat');
    $max = 0;
    for ($i=0;$i<7;$i++){
      if ($data[$i] > $max)$max=$data[$i];  // find the largest data
    }
    $im = imagecreate(320,255); // width , height px

    $white = imagecolorallocate($im,255,255,255); // allocate some color from RGB components remeber Physics
    $black = imagecolorallocate($im,0,0,0);   //
    $red = imagecolorallocate($im,255,0,0);   //
    $green = imagecolorallocate($im,0,255,0); //
    $blue = imagecolorallocate($im,0,0,255);  //
    //
    // create background box
    //imagerectangle($im, 1, 1, 319, 239, $black);
    //draw X, Y Co-Ordinate
    imageline($im, 10, 5, 10, 230, $blue );
    imageline($im, 10, 230, 300, 230, $blue );
    //Print X, Y
    imagestring($im,3,15,5,"Students",$black);
    imagestring($im,3,280,240,"Days",$black);
    imagestring($im,5,100,50,"Simple Graph",$red);
     imagestring($im,5,125,75,"by Vijit",$green);

    // what next draw the bars
    $x = 15;    // bar x1 position
    $y = 230;    // bar $y1 position
    $x_width = 20;  // width of bars
    $y_ht = 0; // height of bars, will be calculated later
    // get into some meat now, cheese for vegetarians;
    for ($i=0;$i<7;$i++){
      $y_ht = ($data[$i]/$max)* 100;    // no validation so check if $max = 0 later;
      imagerectangle($im,$x,$y,$x+$x_width,($y-$y_ht),$red);
      imagestring( $im,2,$x-1,$y+1,$x_fld[$i],$black);
      imagestring( $im,2,$x-1,$y+10,$data[$i],$black);
      $x += ($x_width+20);   // 20 is diff between two bars;

    }
    imagejpeg( $im, "graph.jpeg", 90);
    imagedestroy($im);
    echo "<img src='graph.jpeg'><p></p>"; 

Источник

Кажется, тот факт, что он не выводит заголовок, объясняет, почему он работает, хотя почему другие раньше работали, а теперь не выходят за рамки меня, тем более что ошибки также реплицируются на неродственном удаленном хосте, я просто невежественен и ошибочно называю сценарии? И прежде чем кто-нибудь спросит, да, я уверен, что GD полностью включен, вот соответствующие спецификации из phpinfo:

Поддержка GD: включена
Версия GD: в комплекте (совместимо с 2.0.34)
Поддержка FreeType: включена
Связь FreeType: с типом freetype
Версия FreeType: 2.1.9
Поддержка T1Lib: включена
Поддержка чтения GIF: включено
Поддержка создания GIF: включена
Поддержка JPG: включено
Поддержка PNG: включено
Поддержка WBMP: включено
Поддержка XBM: включена

Может кто-нибудь, пожалуйста, просветить эту сбитую с толку девушку?

Ответы [ 6 ]

4 голосов
/ 16 сентября 2010

Причина очень проста (кроме предупреждений о imagecolordeallocate ()).

Вам необходимо закодировать и сохранить файл сценария как UTF-8 withuot BOM или ASCII. В настоящее время он сохраняется как UTF-8, что вызывает проблему из-за дополнительного символа спецификации.

Символ BOM на страницах в кодировке UTF-8 портит вывод, поскольку он отправляется как первый символ. Использование спецификации является необязательным, и, если оно используется, оно появляется в начале текстового потока.

Используйте любой расширенный текстовый редактор или IDE, например Notepad ++ , чтобы закодировать файл сценария и сохранить его.

1 голос
/ 16 сентября 2010

Возможно, вы захотите проверить, нет ли пробелов перед открытием тегов PHP, так как это переведет сервер в режим text / html.

РЕДАКТИРОВАТЬ: Ах да, поцарапать это.Это то, что сказал полковник Шрапнель.Ошибка заставляет страницу в text / html.

1 голос
/ 16 сентября 2010

это не проблема заголовка.
Это неправильный счетчик параметров для imagecolordeallocate (), вызывающий весь беспорядок
Хотя этот код прост и понятен.

1 голос
/ 16 сентября 2010

Есть ли в вашем файле какие-либо пробелы (возможно, за пределами тегов <?php ... ?>)? Любые случайные пробелы будут отправлены клиенту, после чего заголовки больше не могут быть отправлены. Судя по номеру строки в вашем сообщении об ошибке, перед открытием <?php, возможно, есть пробел, поэтому убедитесь, что это первое в скрипте.

Кроме того, из ваших сообщений об ошибках видно, что вы звоните imagecolordeallocate с неправильным количеством параметров. Предполагается, что первым аргументом будет дескриптор вашего изображения, поэтому правильный вызов будет

imagecolordeallocate($my_img, $line_color);
imagecolordeallocate($my_img, $text_color);
imagecolordeallocate($my_img, $background);

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

0 голосов
/ 27 января 2018

Ваша проблема - путь к папке. Создайте папку для изображения, например: barla

После изменения заголовка заголовка («Тип контента: barla / image / png»);

0 голосов
/ 16 сентября 2010

Как говорится в сообщении об ошибке, некоторые данные получают из файла H: \ xampp \ htdocs \ tests \ script.php в строке 1

...