tags:

views:

33

answers:

6

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?

A: 

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.

Daniel Vandersluis
+1  A: 

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

Col. Shrapnel
First code block has the parameter count issue, second code block doesn't have that error - not the whole problem.
Rudu
A: 

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.

ianhales
+2  A: 

It's not the lack of header exactly - the header command has to be the first thing output to the file. (Or actually to the client through HTTP). If any command before that generates output then the header will always give the message:

Warning: Cannot modify header information - 
  headers already sent by (output started at H:\xampp\htdocs\tests\script.php:1)

Because it's saying line 1, check the beginning of your PHP file to make sure nothing is before the <?php nothing including newlines, spaces, tabs etc, and make sure there's no echos etc. You can also move your header line up to the top of the file, although there's likely an underlying problem in there somewhere still.

Updated script 2:

<?php
header("Content-type: image/png");
// 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
imagepng($img);

// free memory
imagedestroy($img);
?>
Rudu
A: 

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

Petah
+3  A: 

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.

shamittomar
You are correct, I changed the scripts' encoding to UTF-8 withuot BOM and they all work flawlessly. Thanks again!
Clarissa
You're welcome.
shamittomar