ID: 45437
Updated by: [EMAIL PROTECTED]
Reported By: ms at mac-specialist dot com
Status: Feedback
Bug Type: GD related
Operating System: OS X 10.5.3
PHP Version: 5.2.6
Assigned To: pajoye
New Comment:
We need a small script. It should only contains the image creation,
draw some text and save the image, without using any GET/POST/SESSION or
whatever else but the ttf file. Something like a 5 lines scripts.
Previous Comments:
------------------------------------------------------------------------
[2008-07-06 22:03:13] ms at mac-specialist dot com
This includes the three files (which I have renamed to make them
easier to distinguish), as well as the browser output source :
( 1 ) Main File : random_image_sample.php
( 2 ) Include File : inc_random_image_one.php
( a ) 'inc_random_image_one.php' requires "images/noise.jpg",
which can be downloaded from http://www.reconn.us/images/noise.png
( b ) 'inc_random_image_one.php' requires that you copy 10
different named fonts from /Library/Fonts/ to ./fonts/ and rename
them from "1.ttf" to "10.ttf"
( 3 ) Include File : inc_random_image_two.php
( a ) This is example ( 1 ) found on
http://us.php.net/imagettftext
<?php
session_start();
// <!-- [4325] ( BEGIN ) random_image_sample.php -->
?>
<HTML>
<HEAD>
<TITLE>Random image sample</TITLE>
<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso-
8859-1\">
</HEAD>
<BODY>
<?php
if(isset($_POST['Submit']))
{
$number = $_POST['number'];
if(md5($number) != $_SESSION['image_value'])
echo '<h1>Validation string not valid! Please try again!</h1>';
else
{
echo '<h1>Your string is valid!</h1>';
// do something with the data
}
}
?>
<form name="form1" method="post" action="random_sample.php">
<table cellspacing="0" width="600" align="center">
<tr><td valign="top" align="right">Comments</td>
<td><input name="message" size=40 value="...your message here">
</td></tr>
<tr><td colspan=2 align="center">
<font size="1" face="Geneva, Arial, Helvetica, sans-
serif"><strong><font size="2">
Please enter the string shown in the image in the form.<br> The
possible characters are letters from A to Z in capitalized form and
the numbers from 0 to 9.
</font></td></tr>
<tr><td align="center" colspan=2><input name="number" type="text"
id=\"number\"></td></tr>
<tr><td colspan=2 align="center">
<?php $which_image = 2 ; echo ($which_image == 1) ? '<img
src="inc_random_image_one.php">' : '<img
src="inc_random_image_two.php">' ; ?>
</td></tr>
<tr><td colspan=2 align="center"><input name="Submit" type="submit"
value="Submit"></td></tr>
</table>
</form>
</BODY>
</HTML>
<!-- [4325] ( _END_ ) random_image_sample.php -->
<?php
// <!-- [4326] ( BEGIN ) inc_random_image_one.php -->
// This demo requires "images/noise.jpg", which can be downloaded from
http://www.reconn.us/images/noise.png
// start a session
session_start();
// this function is called recursivelly
function random_string($len=5, $str='')
{
for($i=1; $i<=$len; $i++)
{
// Generates a random number that will be the ASCII code of the
character.
// We only want numbers (ascii code from 48 to 57) and caps
letters.
$ord=rand(48, 90);
if((($ord >= 48) && ($ord <= 57)) || (($ord >= 65) && ($ord <=
90)))
$str.=chr($ord);
// If the number is not good we generate another one
else
$str.=random_string(1);
}
return $str;
}
// create the random string using the upper function (if you want more
than 5 characters just modify the parameter)
$rand_str=random_string(5);
// We memorize the md5 sum of the string into a session variable
$_SESSION['image_value'] = md5($rand_str);
// Get each letter in one valiable, we will format all letters
different
$letter1=substr($rand_str,0,1);
$letter2=substr($rand_str,1,1);
$letter3=substr($rand_str,2,1);
$letter4=substr($rand_str,3,1);
$letter5=substr($rand_str,4,1);
// Creates an image from a png file. If you want to use gif or jpg
images, just use the coresponding functions: imagecreatefromjpeg and
imagecreatefromgif.
// You can download "noise.png" at
http://www.reconn.us/images/noise.png
$image=imagecreatefrompng("images/noise.png");
// $image=imagecreatefromjpeg("images/noise.jpg");
// Get a random angle for each letter to be rotated with.
$angle1 = rand(-20, 20);
$angle2 = rand(-20, 20);
$angle3 = rand(-20, 20);
$angle4 = rand(-20, 20);
$angle5 = rand(-20, 20);
// Get a random font. (In this examples, the fonts are located in
"fonts" directory and named from 1.ttf to 10.ttf)
// The easiest thing here is to copy 10 different named fonts from
/Library/Fonts/ to ./fonts/ and rename them
$font1 = "fonts/".rand(1, 10).".ttf";
$font2 = "fonts/".rand(1, 10).".ttf";
$font3 = "fonts/".rand(1, 10).".ttf";
$font4 = "fonts/".rand(1, 10).".ttf";
$font5 = "fonts/".rand(1, 10).".ttf";
// Define a table with colors (the values are the RGB components for
each color).
$colors[0]=array(122,229,112);
$colors[1]=array(85,178,85);
$colors[2]=array(226,108,97);
$colors[3]=array(141,214,210);
$colors[4]=array(214,141,205);
$colors[5]=array(100,138,204);
// Get a random color for each letter.
$color1=rand(0, 5);
$color2=rand(0, 5);
$color3=rand(0, 5);
$color4=rand(0, 5);
$color5=rand(0, 5);
// Allocate colors for letters.
$textColor1 = imagecolorallocate ($image,
$colors[$color1][0],$colors[$color1][1], $colors[$color1][2]);
$textColor2 = imagecolorallocate ($image,
$colors[$color2][0],$colors[$color2][1], $colors[$color2][2]);
$textColor3 = imagecolorallocate ($image,
$colors[$color3][0],$colors[$color3][1], $colors[$color3][2]);
$textColor4 = imagecolorallocate ($image,
$colors[$color4][0],$colors[$color4][1], $colors[$color4][2]);
$textColor4 = imagecolorallocate ($image,
$colors[$color5][0],$colors[$color5][1], $colors[$color5][2]);
// Write text to the image using TrueType fonts.
$size = 20;
imagettftext($image, $size, $angle1, 10, $size+15, $textColor1,
$font1, $letter1);
imagettftext($image, $size, $angle2, 35, $size+15, $textColor2,
$font2, $letter2);
imagettftext($image, $size, $angle3, 60, $size+15, $textColor3,
$font3, $letter3);
imagettftext($image, $size, $angle4, 85, $size+15, $textColor4,
$font4, $letter4);
imagettftext($image, $size, $angle5, 110, $size+15, $textColor5,
$font5, $letter5);
header('Content-type: image/jpeg');
imagejpeg($image); // Output image to browser
imagedestroy($image); // Destroys the image
// <!-- [4326] ( _END_ ) inc_random_image_one.php -->
?>
<?php
// <!-- [4327] ( BEGIN ) inc_random_image_two.php -->
// This is example ( 1 ) found on http://us.php.net/imagettftext
//Set the content-type
header("Content-type:image/png");
//Create the image
$image=imagecreatetruecolor(400,30);
//Create some colors
$white=imagecolorallocate($image,255,255,255);
$grey=imagecolorallocate($image,128,128,128);
$black=imagecolorallocate($image,0,0,0);
imagefilledrectangle($image,0,0,399,29,$white);
//The text to draw
$text='Testing...';
//Replace path by your own font path
// $font='fonts/10.ttf';
// $font='/[path to font]/Arial.ttf';
$font='/Library/Fonts/Verdana.ttf';
//Add some shadow to the text
imagettftext($image,20,0,11,21,$grey,$font,$text);
//Addthetext
imagettftext($image,20,0,10,20,$black,$font,$text);
//Using imagepng()results in clearer text compared with imagejpeg()
imagepng($image);
imagedestroy($image);
// <!-- [4327] ( _END_ ) inc_random_image_two.php -->
?>
<!-- OUTPUT BROWSER SOURCE -->
<!-- [4325] ( BEGIN ) random_image_sample.php -->
<HTML>
<HEAD>
<TITLE>Random image sample</TITLE>
<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso-
8859-1\">
</HEAD>
<BODY>
<form name="form1" method="post" action="random_sample.php">
<table cellspacing="0" width="600" align="center">
<tr><td valign="top" align="right">Comments</td>
<td><input name="message" size=40 value="...your message here">
</td></tr>
<tr><td colspan=2 align="center">
<font size="1" face="Geneva, Arial, Helvetica, sans-
serif"><strong><font size="2">
Please enter the string shown in the image in the form.<br> The
possible characters are letters from A to Z in capitalized form and
the numbers from 0 to 9.
</font></td></tr>
<tr><td align="center" colspan=2><input name="number" type="text"
id=\"number\"></td></tr>
<tr><td colspan=2 align="center">
<img src="random_image_two.php"> <!-- THIS IMAGE CONTAINS NOTHING -->
</td></tr>
<tr><td colspan=2 align="center"><input name="Submit" type="submit"
value="Submit"></td></tr>
</table>
</form>
</BODY>
</HTML>
<!-- [4325] ( _END_ ) random_image_sample.php -->
------------------------------------------------------------------------
[2008-07-06 09:39:06] [EMAIL PROTECTED]
Please provide a link to the font you use.
Also you may send the header right before the PNG generation:
header("Content-type:image/png");
imagepng($image);
imagedestroy($image);
You may look at the contents of the page (show source), If it is a
blank page, it may contain error messages not displayed because of the
Content-Type.
------------------------------------------------------------------------
[2008-07-06 06:27:26] ms at mac-specialist dot com
Description:
------------
Same exact problem as Bug #44524, which has been written off as bogus.
IT IS NOT BOGUS...
Problem:
------------
Calls to imagettftext always fail with no error on Leopard 10.5.3
when run under MacPorts Apache 2.2.6, PHP 5.2.5 and the GD library.
Originally I tried the "PHP Form image verification" example at :
http://www.reconn.us/content/view/28/49/
I then tried example ( 1 ) found on http://us.php.net/imagettftext
Both examples failed to display the results and provided not visible
error, so I fired up the ZEND DEBUGGER and that is when I found the
culprit, I then checked the Apache error log and found...
Reproduce code:
---------------
<?php
// This is example ( 1 ) found on http://us.php.net/imagettftext
//Set the content-type
header("Content-type:image/png");
//Create the image
$image=imagecreatetruecolor(400,30);
//Create some colors
$white=imagecolorallocate($image,255,255,255);
$grey=imagecolorallocate($image,128,128,128);
$black=imagecolorallocate($image,0,0,0);
imagefilledrectangle($image,0,0,399,29,$white);
//The text to draw
$text='Testing...';
//Replace path by your own font path
// $font='fonts/10.ttf';
$font='/[path to font]/Arial.ttf';
//Add some shadow to the text
imagettftext($image,20,0,11,21,$grey,$font,$text);
//Addthetext
imagettftext($image,20,0,10,20,$black,$font,$text);
//Using imagepng()results in clearer text compared with imagejpeg()
imagepng($image);
imagedestroy($image);
?>
Expected result:
----------------
Small image containing "Testing..."
Actual result:
--------------
Checking the Apache error log shows many instances of :
Break on
__THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTION
ALITY___YOU_MUST_EXEC__() to debug.
[Sun Jul 06 00:45:18 2008] [notice] child pid 2990 exit signal
Trace/BPT
trap (5)
When I trace Using ZEND DEBUGGER the call to imagettftext shows where
the break in execution occurs.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=45437&edit=1