iptton 发表于 2007-4-4 20:35

[已解决][补充部分原理]关于php 生成图形



图形验证就是在服务端临时生成一个图像

//以下若干行废话:
(其实所有HTML应该也是临时生成的吧?
只是和图象文件的header不同,
图像文件和HTML文件一样是一连串
由服务端发给发送http请求的客户端的字符
然后浏览器根据header等信息解释这连串字符怎么显示出来
)
//End of 废话


并把文件传给客户端
图形中包含的字符信息一般保存在 session里 ,
验证用户输入的正确与否就靠Session来判断






刚体验了JAVA的图形验证
想学下PHP的图形验证码
但出问题了:<
完全照PHP帮助打的代码,生成的却是一个红叉。。。
GD扩展已安装,php.ini 已修改 并重启Apache N次了...

不知有没有人遇到过这种情况....

PHP5.2

image.php
<?php
    header("Content-type: image/png");
    $string = $_GET['text'];
    $im   = imagecreatefrompng("images/button1.png");
    $orange = imagecolorallocate($im, 220, 210, 60);
    $px   = (imagesx($im) - 7.5 * strlen($string)) / 2;
    imagestring($im, 3, $px, 9, $string, $orange);
    imagepng($im);
    imagedestroy($im);
?>
testimage.php
<img src="image.php"></img>

文件 images/button1.png 存在...
已解决,把php文件改为ANSI编码就可以了,有达人可以解释下为什么吗?

[ 本帖最后由 iptton 于 2007-4-8 10:49 编辑 ]

hjack 发表于 2007-4-4 20:52

引用图片的问题/??

iptton 发表于 2007-4-4 20:57

用了网上其它的代码
没有引用图片
生成的还是个叉

iptton 发表于 2007-4-4 21:15

用迅雷下载:
PNG

   
IHDR   c   x   iHۚ    IDATxYeYv>#2rʪʚfwSH剶`ڒ
ǀ`׀? 0 6 0,ؒ)@3DQdlU93rΌs}dِGdd""#~gZkkRhZ5ͩ      Ћ1}@rJdתnftd:5͟}OϏ\ʩdIbܙm⫇{e(X1lɣݹל6{0D0HX-F (t$FB2!IJ@T0Ŭ6      
(省略).....


[ 本帖最后由 iptton 于 2007-4-4 21:25 编辑 ]

iptton 发表于 2007-4-4 21:17

把编码改为&nbsp;&nbsp;ANSI  奇迹就出现了... <br />

<?php
    header("Content-type: image/jpeg");
    $string = $_GET['text'];
    $im   = imagecreatefrompng("images/button1.png");
    $orange = imagecolorallocate($im, 255, 255, 255);
    $px   = (imagesx($im) - 7.5 * strlen($string)) / 2;
    imagestring($im, 3, $px, 9, $string, $orange);
    imagejpeg($im);
    imagedestroy($im);
?>


<img src="images/smilies/aa59.gif" smilieid="115" border="0" alt="" /> <img src="images/smilies/aa59.gif" smilieid="115" border="0" alt="" /> <img src="images/smilies/aa59.gif" smilieid="115" border="0" alt="" />

[ 本帖最后由 iptton 于 2007-4-4 21:23 编辑 ]

MJOfPowerwind 发表于 2007-4-4 21:40

又和编码有关?
最烦的就是编码啦!

iptton 发表于 2007-4-4 21:53

刚刚试了下中文,
乱码....
image.php?text=中文
得到的不是中文两个字,而是四个乱码。。。

试过
header("content-type:image/jpeg;charset=gb2312");无效...

brilon 发表于 2007-4-6 09:00

JAVA图形验证。。有吗。。。我也找找资料。。

hjack 发表于 2007-4-7 02:24

$draw = new Draw(600,400);//这个是我定义的类。
    $draw->linedrawing($result,$begin,$end);
    $imgpath = "./images/02_01_01.png";
    $draw->saveImg($imgpath);
    $SMARTY->assign("img",$imgpath);



<td><img src="{/$img/}"></td>

发现之前我是这样画的。。。header什么也没有设置 。。。

iptton 发表于 2007-4-7 12:04

可以在图里面显示中文吗?
试试先..

hjack 发表于 2007-4-7 20:30

原帖由 iptton 于 2007-4-7 12:04 发表
可以在图里面显示中文吗?
试试先..

可能不行...没试过.当时只是输出数字到图片上.

iptton 发表于 2007-4-8 10:37


因为GD函数只接受UTF8格式编码的文字,所以在写文字前首先要进行编码转换。PHP自带的iconv和mbstring库都可以完成这项工作,

刚搜了下,原来是这样...
顺带把作者写的转换代码帖上:

<?php
/*****************************************************************
* excode.php
* @author风舞
* @email   wjiujun (at) gmail.com
* @note    一个中文附加码
*****************************************************************/
$RANDCODE=array('宠','辱','不','惊','静','看','庭','前','花','开','花','落','得','失','无','意','漫','望','天','外','云','卷','云','舒');
$CODETABLE=array();
$fp=fopen("gb2312.txt","r");
while($line=fgets($fp))
    $CODETABLE=substr($line,7,6);
fclose($fp);

//gb2312转utf8
function gb2utf8($gbstr)
{
    global $CODETABLE;
    if(trim($gbstr)=="")
      return $gbstr;
    $ret="";
    $utf8="";
    while($gbstr)
    {
      if(ord(substr($gbstr,0,1))>127)
      {
            $thisW=substr($gbstr,0,2);
            $gbstr=substr($gbstr,2,strlen($gbstr));
            $utf8="";
            @$utf8=u2utf8(hexdec($CODETABLE));
            if($utf8!="")
            for($i=0;$i<strlen($utf8);$i+=3)
                $ret.=chr(substr($utf8,$i,3));
      }
      else
      {
            $ret.=substr($gbstr,0,1);
            $gbstr=substr($gbstr,1,strlen($gbstr));
      }
    }
    return $ret;
}

//unicode转utf8
function u2utf8($c)
{
    $str="";
    if($c<0x80)
      $str.=$c;
    elseif($c<0x800)
    {
      $str.=(0xC0|$c>>6);
      $str.=(0x80|$c&0x3F);
    }
    elseif($c<0x10000)
    {
      $str.=(0xE0|$c>>12);
      $str.=(0x80|$c>>6&0x3F);
      $str.=(0x80|$c&0x3F);
    }
    elseif($c<0x200000)
    {
      $str.=(0xF0|$c>>18);
      $str.=(0x80|$c>>12&0x3F);
      $str.=(0x80|$c>>6&0x3F);
      $str.=(0x80|$c&0x3F);
    }
    return $str;
}

//生成附加码
function create_excode($length)
{
global $RANDCODE;
    header("content-type: image/png");
$image_x=$length*30;    //图片宽度
$image_y=40;            //图片高度
    $noise_num=80*$length;   //杂点数量
    $line_num=$length-2;      //干扰线数量
$image=imagecreate($image_x,$image_y);
imagecolorallocate($image,0xff,0xff,0xff);                  //设定背景颜色
$rectangle_color=imagecolorallocate($image,0xAA,0xAA,0xAA); //边框颜色
$noise_color=imagecolorallocate($image,0x00,0x00,0x00);   //杂点颜色
$font_color=imagecolorallocate($image,0x00,0x00,0x00);      //字体颜色
$line_color=imagecolorallocate($image,0x33,0x33,0x33);      //干扰线颜色

//加入杂点
    for($i=0;$i<$noise_num;$i++)
imagesetpixel($image,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color);

$font_face="simkai.ttf";    //字体
    $x=2;
    $session_code='';
    for($i=0;$i<$length;$i++)
    {
      $code=$RANDCODE;
   imagettftext($image,18,mt_rand(-6,6),$x,29,$font_color,$font_face,gb2utf8($code));
      $x+=30;
      $session_code.=$code;
    }
    @session_start();
    $_SESSION['excode']=$session_code;//把附加码的值放在session中

    //加入干扰线
    for($i=0;$i<$line_num;$i++)
   imageline($image,mt_rand(0,$image_x),mt_rand(0,$image_y),
                  mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color);
imagerectangle($image,0,0,$image_x-1,$image_y-1,$rectangle_color);//加个边框
imagepng($image);
imagedestroy($image);
}
create_excode(6);
?>

作者还说到:

PHP自带的iconv和mbstring库都可以完成这项工作,但一般的虚拟主机很少支持,所以要自己写个,像这里用gb2utf8完成这项工作。当然如果你的页面就是以UTF8格式存储的,就可以省去这些额外工作。

但之前我就是用UTF-8保存php文件才显示不了图像,才有此帖...


出处:http://phpweblog.net/

iptton 发表于 2007-4-8 10:52

原帖由 brilon 于 2007-4-6 09:00 发表
JAVA图形验证。。有吗。。。我也找找资料。。

java图形验证码网上大把...
下面这个生成验证session名为:getImg

<%@page   import="java.io.*,java.util.*,com.sun.image.codec.jpeg.*,java.awt.*,java.awt.image.*"%>   
<%   
//根据dkmilk(迪克牛奶)修改,   
//请参考http://expert.csdn.net/Expert/topic/1824/1824843.xml?temp=.8515589   
try{   
Font   mFont=new   Font("宋体",   Font.PLAIN,12);//设置字体   
//取得一个1000-9999的随机数   
String   s="";   
int   intCount=0;   
intCount=(new   Random()).nextInt(9999);//   
if(intCount<1000)intCount+=1000;   
s=intCount+"";   
//对session付值。   
session.setAttribute("getImg",s);   
response.setContentType("image/gif");   
ServletOutputStream   outs=   response.getOutputStream();//   ServletOutputStream(out);//.;   
BufferedImage   image=new   BufferedImage(35,14,BufferedImage.TYPE_INT_RGB);   
Graphics   gra=image.getGraphics();   
//设置背景色   
gra.setColor(Color.yellow);   
gra.fillRect(1,1,33,12);   
//设置字体色   
gra.setColor(Color.black);   
gra.setFont(mFont);   
//输出数字   
char   c;
for(int   i=0;i<4;i++)   {   
c=s.charAt(i);
gra.drawString(c+"",i*7+4,11);   //7为宽度,11为上下高度位置   
}   
JPEGImageEncoder   encoder=JPEGCodec.createJPEGEncoder(outs);   
encoder.encode(image);   
outs.close();   
}catch(Exception   e){   
System.out.println("have   error");   
}   

%>
页: [1]
查看完整版本: [已解决][补充部分原理]关于php 生成图形