无法显示GD图像

时间:2014-02-18 11:03:48

标签: php image gd captcha

我的代码: 将此文件另存为captcha.php

    <?php
ob_start();
session_start();
if(!isset($_POST['submit'])){
    echo "<form method=\"post\" action=\"captcha.php\">\n";
    echo "<table border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n";
    echo "<tr><td>Type The Letters You See Below Into the Box</td></tr>\n";
    echo "<tr><td align=\"center\"><img src=\"image.php\"></td></tr>\n";
    echo "<tr><td align=\"center\"><input type=\"text\" name=\"image\"></td></tr>\n";
    echo "<tr><td align=\"center\"><input type=\"submit\" name=\"submit\" value=\"Check CAPTCHA\"></td></tr>\n";
    echo "</table></form>\n";
}else {
    $image = $_POST['image'];
    if ($image == $_SESSION['string'])
    {
        echo "<b>Great success!</b>\n";
    }
    else 
    {
        echo "<em>Failure!</em>\n";
    }
}
ob_end_flush();
?> 

将此文件另存为image.php

<?php

session_start();
$img = imagecreatetruecolor(118,80);

$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
$red = imagecolorallocate($img, 255, 0, 0);
$grey = imagecolorallocate($img,150, 150, 150);
$pink = imagecolorallocate($img, 200, 0, 150);
$yellow = imagecolorallocate($img, 255, 246, 0);

function randomString($length){
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $str = "";
    $i = 0;

        while($i <= $length){
            $num = rand() % 33;
            $tmp = substr($chars, $num, 1);
            $str = $str . $tmp;
            $i++;
        }
    return $str;
}

for($i=1;$i<=rand(1,5);$i++){
    $color = (rand(1,2) == 1) ? $pink : $red;
    imageline($img,rand(6,90),rand(6,40), rand(6,90)+6,rand(6,40)+6, $color);
}

imagefill($img, 0, 0, $yellow);

$string = randomString(rand(4,6));
$_SESSION['string'] = $string;

imagettftext($img, 20, 10, 10, 52, $black, "calibri.ttf", $string);
imagettftext($img, 20, 10, 12, 53, $grey, "calibri.ttf", $string);

header("Content-type: image/png");
imagepng($img);
imagedestroy($img);

?>

转到此地址http://www.cufonfonts.com/en/font/12048/calibri并下载字体并将其保存在与我们刚创建的.php文件相同的根文件夹中。

请注意!这将在本地主机上运行,​​但是我有一个像image.php文件这样的问题,正如我所说的那样 - &gt; JFIF &gt; CREATOR:gd-jpeg v1.0(使用IJG JPEG v90),默认质量 C$。 “,#(7),01444'9 = 82&lt;.342 C2!!22222222222222222222222222222222222222222222222222 x” }!1AQa“q2 #B R $3br 。

当我尝试并将其添加到我创建的CMS时,这只会发生。所有我需要知道为什么会发生这种情况我感觉很难用“标题”(“内容类型:图像/ png”);“虽然我可能有点不对劲。请帮我。顺便说一下,我正在尝试添加电子邮件表单并让验证码对其进行评估

这是我试图将代码插入的表单: 你可以将它保存为form.php

<?php
$query = mysql_query("SELECT * FROM forms where id = '$formid'");

echo '<h2>'.mysql_result($query, 0, "title").'</h2>';

if(mysql_result($query, 0, "description") != "") {
    echo '<p>'.mysql_result($query, 0, "description").'</p>';
} 
error_reporting(E_ERROR);

?>
<form action="plugins/form_send.php" method="post" enctype="multipart/form-data" class="ajax" name="formplugin" id="form_<?php echo $formid; ?>">
<input name="formid" id="formid" type="hidden" value="<?php echo $formid; ?>" />
  <p><span class="required">*</span> = required fields.</p>
  <table border="0" cellspacing="5" cellpadding="5">
    <?php 
    $field_labels_col = mysql_result($query, 0, "field_label");
    $field_labels = array();
    $field_labels =(explode('|', $field_labels_col));

    $field_types_col = mysql_result($query, 0, "field_type");
    $field_types = array();
    $field_types =(explode('|', $field_types_col));

    $field_option1_col = mysql_result($query, 0, "field_option1");
    $field_option1 = array();
    $field_option1 =(explode('|', $field_option1_col));

    $field_option2_col = mysql_result($query, 0, "field_option2");
    $field_option2 = array();
    $field_option2 =(explode('|', $field_option2_col));

    $field_validtype_col = mysql_result($query, 0, "field_validtype");
    $field_validtype = array();
    $field_validtype =(explode('|', $field_validtype_col));

    $i = 0;
    while (array_key_exists($i, $field_labels))
    {
    if(!isset($title)) { $title = ''; }
    if($title != $field_labels[$i]) {

    if(isset($field_labels[$i])) { $title = $field_labels[$i]; }
    if(isset($title)) { $stripped = urlify($title); }
    if(isset($field_types[$i])) { $type = $field_types[$i]; }
    if(isset($field_option1[$i])) { $option1 = $field_option1[$i]; }
    if(isset($field_option2[$i])) { $option2 = $field_option2[$i]; }
    if(isset($field_validtype[$i])) { $valid = $field_validtype[$i]; }

    echo '<tr>';
      echo '<td align="left" valign="top">'.$title.'</td>';
      echo '<td align="left" valign="top">';

        // -- INPUT FIELDS --
        if($type == "input") {
            echo '<input name="'.$stripped.'" type="text" id="'.$stripped.'" size="'.$option1.'" maxlength="'.$option2.'" />';
            if($valid != '') { echo '<span class="required">*</span>'; }
        }

        // -- TEXT AREAS --
        if($type == "textarea") {
            echo '<textarea name="'.$stripped.'" cols="'.$option1.'" rows="size="'.$option2.'"" id="'.$stripped.'"></textarea>';
        }

        // -- DROP DOWNS --
        if($type == "dropdown") {
            echo '<select name="'.$stripped.'" id="'.$stripped.'">';
                $l = 0;
                while (array_key_exists($l, $field_labels))
                {
                $thisoption = $field_option1[$l];
                $thistitle = $field_labels[$l];
                if($thistitle == $title) {
                echo '<option value="'.$thisoption.'">'.$thisoption.'</option>';
                }
                $l++;
                }
            echo'</select>';
        }

        // -- RADIO BUTTONS --
        if($type == "radiobutton") {
            $l = 0;
            while (array_key_exists($l, $field_labels))
            {
            $thisoption = $field_option1[$l];
            $thistitle = $field_labels[$l];
            $thisstripped = urlify($field_labels[$l]);
            if($thistitle == $title) {
              echo '<label><input type="radio" name="'.$thistitle.'" id="'.$thisstripped.'" value="'.$option1.'">'.$thisoption.'</label><br />';
            }
            $l++;
            }
        }

        // -- SIMPLE YES / NO --
        if($type == "yesno") {
            echo '<label><input type="radio" name="'.$stripped.'" id="'.$stripped.'" value="Yes">Yes</label>';
            echo '<label><input type="radio" name="'.$stripped.'" id="'.$stripped.'" value="No">No</label>';
        }

        // -- FILE UPLOADS --
        if($type == "fileupload") {
            echo '<input type="file" name="'.$stripped.'" id="'.$stripped.'" size="10"> (2mb limit)';
        }

      echo '</td>';
    echo '</tr>';
    }
    $i++;
    }
?>
    <tr id="comment-div"><td colspan="2"><input name="user-comment" size="3" value="" /></td></tr>

    <tr>
        <td colspan="2">
            <?php if(mysql_result($query, 0, "submit_text") != "") { ?>
                <p><br /><?php echo mysql_result($query, 0, "submit_text"); ?></p>
            <?php } ?>
            <div id="result"><strong>Loading... please wait.</strong></div>
            <!-- <input type="submit" name="button" id="button" value="<?php echo mysql_result($query, 0, "submit_button"); ?>" /> -->



        </td>
    </tr>
  </table>
</form>

3 个答案:

答案 0 :(得分:1)

我猜您发布的代码不是整个文件:尝试删除<?php?>标记之前和之后的所有内容。你甚至可以remove the final tag ?>(这是许多人采用的一种风格惯例,因为这个问题)。

这会影响您正在执行的每个其他文件:PHP标记之外或PHP回显的每个空格,换行符或其他内容都会添加到图像内容中,最终会导致图像损坏。 PHP通知和警告也是一个问题。

为清楚起见,执行的文件格式必须为:

<?php // nothing before this line
// no other PHP tags till the end
... // PHP code with no echo calls
// no closing tag

在您的代码中,您可以:

header( "Content-type: image/png" );
# ...
echo "<img src='image/png;base64," . base64_encode( $x )."'>";

您正在输出带有HTML的PNG,这不可避免地会破坏您的图像内容。您必须删除HTML(echo $x)并使用其他文件中的图像,例如。与

<img src="png_generator_script.php"/>

或者将脚本用作HTML页面,删除

header( "Content-type: image/png" );

答案 1 :(得分:0)

此代码工作正常。我已经在chrome&amp; amp;火狐。

答案 2 :(得分:0)

我遇到了同样的问题。删除它将100%工作的所有html标签..

另存为php文件.. index.php

<?php
/**
 * PHP GD
 * create a simple image with GD library
 * 
 */
//setting the image header in order to proper display the image
header("Content-Type: image/png");
//try to create an image
$im = @imagecreate(800, 600)
    or die("Cannot Initialize new GD image stream");
//set the background color of the image
$background_color = imagecolorallocate($im, 0xFF, 0xCC, 0xDD);
//set the color for the text
$text_color = imagecolorallocate($im, 133, 14, 91);
//adf the string to the image
imagestring($im, 5, 300, 300,  "I'm a pretty picture:))", $text_color);
//outputs the image as png
imagepng($im);
//frees any memory associated with the image 
imagedestroy($im);
?>

而不是......

<html>
<head>
</head>
<body>

<?php
/**
 * PHP GD
 * create a simple image with GD library
 * 
 */
//setting the image header in order to proper display the image
header("Content-Type: image/png");
//try to create an image
$im = @imagecreate(800, 600)
    or die("Cannot Initialize new GD image stream");
//set the background color of the image
$background_color = imagecolorallocate($im, 0xFF, 0xCC, 0xDD);
//set the color for the text
$text_color = imagecolorallocate($im, 133, 14, 91);
//adf the string to the image
imagestring($im, 5, 300, 300,  "I'm a pretty picture:))", $text_color);
//outputs the image as png
imagepng($im);
//frees any memory associated with the image 
imagedestroy($im);
?>
</body>
</html>