PHP GD 标头问题
几个月前,我在本地主机上启用了 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 );
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);
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>";
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这不是标题问题。
imagecolordeallocate() 的参数计数错误导致整个混乱
虽然这一点简单明了。
it's not header problem.
It's Wrong parameter count for imagecolordeallocate() causing whole mess
While this one is plain and clear.
在打开 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.
您的文件中是否有任何空格(可能在
标记之外)?任何杂散的空格都将被发送到客户端,之后将无法再发送标头。根据错误消息中的行号,在打开
之前可能有空格,因此请确保它是脚本中的第一件事。
另外,从错误消息中,您可以看到您正在调用
imagecolordeallocate
的参数数量错误。第一个参数应该是您的图像句柄,因此正确的调用是输出的错误消息也将发送到客户端,这将阻止设置标头。
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 beThe error messages being outputted would also be sent to the client which would prevent headers from being set.
正如错误所说,有些东西正在从第 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
你的问题是文件夹路径
例如,为图像创建一个文件夹: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");
原因很简单(除了有关 imagecolordeallocate() 的警告之外)。
您需要将脚本文件编码并保存为
UTF-8 withoutuot BOM
或ASCII
。目前它被保存为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
orASCII
. It is currently saved asUTF-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.