PHP GD 标头问题

发布于 2024-09-19 11:04:59 字数 1170 浏览 8 评论 0原文

几个月前,我在本地主机上启用了 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 中的(输出从 H:\xampp\htdocs\tests\script.php:1 开始)发送第 11 行的 \script.php �PNG ��� IHDR�����P���!#�PLTE�������M�)B����IDATH��1�0EA��N ����:��8Q�JN�d�Z��<代码>��! ���k�Z⊜���k��g�˕��|K$�M��|)��$�8DfRQB���-��[I��

A couple of months ago I enabled GD on localhost to play around with it a bit, used various scripts found online to get a better understanding of what it does, all good and well.

But now I feel like I'm descending into insanity here because when trying to repeat the above with the exact same scripts I keep getting header errors, both on local and remote host. I figure I must have somehow completely forgotten how do do it right so I need a brief refresher on this.

For example, this was the first script I ever tried:

$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 );

Source

Worked fine back then, now when I run it I get this:

Warning: Cannot modify header information - headers already sent by (output started at H:\xampp\htdocs\tests\script.php:1) in H:\xampp\htdocs\tests\script.php on line 11
�PNG ��� IHDR�������P���!�#��� PLTE���������M�)B����IDATH��1�0EA��N�����:��8Q�JN�d�Z����! � ���k�Z⊜���k��g�˕��|K$�M��|)��$ů8DfRQB���-��[I��????tźR�+���%�"��Ut)(�K�@dF�e�zKF9&�g|C7i��d????��\G�Y � �3y�Ƌ�_�%�����IEND�B

Warning: Wrong parameter count for imagecolordeallocate() in H:\xampp\htdocs\tests\script.php on line 13

Warning: Wrong parameter count for imagecolordeallocate() in H:\xampp\htdocs\tests\script.php on line 14

Warning: Wrong parameter count for imagecolordeallocate() in H:\xampp\htdocs\tests\script.php on line 15

Same thing for the second script I ever tried:

// 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);

Source

That now outputs:

Warning: Cannot modify header information - headers already sent by (output started at H:\xampp\htdocs\tests\script.php:1) in H:\xampp\htdocs\tests\script.php on line 22
�PNG ��� IHDR�����������":9���gIDATx����v�H�a<�4Ƹ���ܕ��:/{�v�}��z����C��(�~��҆�Uj1�jƖ�~)y[�x��JW��+/n�q�9)eɽ?�n�q%Pfg��f� �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��<��N�!&h,�������q�5���v&h,������&��k��X\'��7�l�F�.�-�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,����Ƃ%�q�,�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��۪��T�c�rl��n_J�E]�|��m����}���an>���Խ����IEND�B`�

However, the third script I ever tried still works:

// 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>"; 

Source

It seems that the fact it doesn't output a header is why it works, though why the others used to work and now don't are beyond me, especially since the errors are also being replicated on an unrelated remote host, am I simply being clueless and calling the scripts erroneously? And before anybody asks, yes, I'm sure GD has been fully enabled, here are the relevant specs from phpinfo:

GD Support: enabled
GD Version: bundled (2.0.34 compatible)
FreeType Support: enabled
FreeType Linkage: with freetype
FreeType Version: 2.1.9
T1Lib Support: enabled
GIF Read Support: enabled
GIF Create Support: enabled
JPG Support: enabled
PNG Support: enabled
WBMP Support: enabled
XBM Support: enabled

Can someone please enlighten this befuddled girl?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

醉城メ夜风 2024-09-26 11:05:00

这不是标题问题。
imagecolordeallocate() 的参数计数错误导致整个混乱
虽然这一点简单明了。

it's not header problem.
It's Wrong parameter count for imagecolordeallocate() causing whole mess
While this one is plain and clear.

揪着可爱 2024-09-26 11:05:00

在打开 PHP 标签之前,您可能需要检查是否有空格,因为这会将服务器置于文本/html 模式。

编辑:啊是的,从头开始。斯拉普内尔上校是这么说的。该错误是强制页面进入text/html。

You might want to check there's no whitespace before you open your PHP tags, as this would put the server into text/html mode.

EDIT: Ah yeah, scratch that. It's what Col. Shrapnel said. The error is forcing the page into text/html.

倥絔 2024-09-26 11:05:00

您的文件中是否有任何空格(可能在 标记之外)?任何杂散的空格都将被发送到客户端,之后将无法再发送标头。根据错误消息中的行号,在打开 之前可能有空格,因此请确保它是脚本中的第一件事。

另外,从错误消息中,您可以看到您正在调用 imagecolordeallocate 的参数数量错误。第一个参数应该是您的图像句柄,因此正确的调用是

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

输出的错误消息也将发送到客户端,这将阻止设置标头。

Do you have any whitespace in your file (probably outside of <?php ... ?> tags)? Any stray whitespace will be sent to the client, after which headers can no longer be sent. Based on the line number in your error message, there probably is whitespace before your opening <?php, so ensure that it is the first thing in the script.

Also, from your error messages, you can see that you're calling imagecolordeallocate with the wrong number of parameters. The first argument is supposed to be your image handle, so the correct call would be

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

The error messages being outputted would also be sent to the client which would prevent headers from being set.

情魔剑神 2024-09-26 11:05:00

正如错误所说,有些东西正在从第 1 行的文件 H:\xampp\htdocs\tests\script.php 获取输出

As the error says, some thing is getting output from the file H:\xampp\htdocs\tests\script.php on line 1

软糯酥胸 2024-09-26 11:05:00

你的问题是文件夹路径
例如,为图像创建一个文件夹:barla

更改标题后
header("内容类型:barla/image/png");

Your problem is path of folder
Create a folder for image for example.: barla

After change your header
header("Content-type: barla/image/png");

痴梦一场 2024-09-26 11:04:59

原因很简单(除了有关 imagecolordeallocate() 的警告之外)。

您需要将脚本文件编码并保存为 UTF-8 withoutuot BOMASCII。目前它被保存为 UTF-8,由于额外的 BOM 字符,这导致了问题

UTF-8 编码页面中的 BOM 字符混乱作为第一个字符发送的输出。 BOM 的使用是可选的,如果使用,它会出现在文本流的开头。

使用任何高级文本编辑器或 IDE(例如 Notepad++)对脚本文件进行编码并保存。

The reason is very simple (apart from the warnings about imagecolordeallocate()).

You need to encode and save your script file as UTF-8 withuot BOM or ASCII. It is currently saved as UTF-8 which is causing the problem due to the extra BOM character.

The BOM character in UTF-8 encoded pages messes up the output as it is sent as the first character. BOM use is optional, and, if used, it appear at the start of the text stream.

Use any advanced text-editor or IDE like Notepad++ to encode the script file and save it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文