工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2260|回复: 12

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

[复制链接]
发表于 2007-4-4 20:35 | 显示全部楼层 |阅读模式


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

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


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






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

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

PHP5.2

image.php
  1. <?php
  2.     header("Content-type: image/png");
  3.     $string = $_GET['text'];
  4.     $im     = imagecreatefrompng("images/button1.png");
  5.     $orange = imagecolorallocate($im, 220, 210, 60);
  6.     $px     = (imagesx($im) - 7.5 * strlen($string)) / 2;
  7.     imagestring($im, 3, $px, 9, $string, $orange);
  8.     imagepng($im);
  9.     imagedestroy($im);
  10. ?>
复制代码

testimage.php
  1. <img src="image.php"></img>
复制代码


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

[ 本帖最后由 iptton 于 2007-4-8 10:49 编辑 ]
发表于 2007-4-4 20:52 | 显示全部楼层
引用图片的问题/??
回复

使用道具 举报

 楼主| 发表于 2007-4-4 20:57 | 显示全部楼层
用了网上其它的代码
没有引用图片
生成的还是个叉
回复

使用道具 举报

 楼主| 发表于 2007-4-4 21:15 | 显示全部楼层
用迅雷下载:
  1. PNG
  2. 
  3.    
  4. IHDR   c   x   iH&#1754;    IDATxYeYv>#2r&#682;&#666;fwSH剶`&#1682;
  5. &#448;`&#1472;? 0 6 0,&#1554;)@3DQdlU93r&#908;s}d&#1616;Gdd""#~gZkkRhZ5&#873;        &#1035;1}@rJd&#1514;nftd:5&#863;}O&#975;\&#681;dIb&#1817;m&#10951;{e(X1l&#611;&#1913;&#1500;6{0D0HX-F (t$FB2!IJ@T0&#364;6        
  6. (省略).....
复制代码

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

使用道具 举报

 楼主| 发表于 2007-4-4 21:17 | 显示全部楼层
把编码改为&nbsp;&nbsp;ANSI  奇迹就出现了... <br />

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


<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 编辑 ]
image.jpg
回复

使用道具 举报

发表于 2007-4-4 21:40 | 显示全部楼层
又和编码有关?
最烦的就是编码啦!
回复

使用道具 举报

 楼主| 发表于 2007-4-4 21:53 | 显示全部楼层
刚刚试了下中文,
乱码....
image.php?text=中文
得到的不是中文两个字,而是四个乱码。。。

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

使用道具 举报

发表于 2007-4-6 09:00 | 显示全部楼层
JAVA图形验证。。有吗。。。我也找找资料。。
回复

使用道具 举报

发表于 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什么也没有设置 。。。
回复

使用道具 举报

 楼主| 发表于 2007-4-7 12:04 | 显示全部楼层
可以在图里面显示中文吗?
试试先..
回复

使用道具 举报

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


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

使用道具 举报

 楼主| 发表于 2007-4-8 10:37 | 显示全部楼层
因为GD函数只接受UTF8格式编码的文字,所以在写文字前首先要进行编码转换。PHP自带的iconv和mbstring库都可以完成这项工作,

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

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

  14. //gb2312转utf8
  15. function gb2utf8($gbstr)
  16. {
  17.     global $CODETABLE;
  18.     if(trim($gbstr)=="")
  19.         return $gbstr;
  20.     $ret="";
  21.     $utf8="";
  22.     while($gbstr)
  23.     {
  24.         if(ord(substr($gbstr,0,1))>127)
  25.         {
  26.             $thisW=substr($gbstr,0,2);
  27.             $gbstr=substr($gbstr,2,strlen($gbstr));
  28.             $utf8="";
  29.             @$utf8=u2utf8(hexdec($CODETABLE[hexdec(bin2hex($thisW))-0x8080]));
  30.             if($utf8!="")
  31.             for($i=0;$i<strlen($utf8);$i+=3)
  32.                 $ret.=chr(substr($utf8,$i,3));
  33.         }
  34.         else
  35.         {
  36.             $ret.=substr($gbstr,0,1);
  37.             $gbstr=substr($gbstr,1,strlen($gbstr));
  38.         }
  39.     }
  40.     return $ret;
  41. }

  42. //unicode转utf8
  43. function u2utf8($c)
  44. {
  45.     $str="";
  46.     if($c<0x80)
  47.         $str.=$c;
  48.     elseif($c<0x800)
  49.     {
  50.         $str.=(0xC0|$c>>6);
  51.         $str.=(0x80|$c&0x3F);
  52.     }
  53.     elseif($c<0x10000)
  54.     {
  55.         $str.=(0xE0|$c>>12);
  56.         $str.=(0x80|$c>>6&0x3F);
  57.         $str.=(0x80|$c&0x3F);
  58.     }
  59.     elseif($c<0x200000)
  60.     {
  61.         $str.=(0xF0|$c>>18);
  62.         $str.=(0x80|$c>>12&0x3F);
  63.         $str.=(0x80|$c>>6&0x3F);
  64.         $str.=(0x80|$c&0x3F);
  65.     }
  66.     return $str;
  67. }

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

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

  86. $font_face="simkai.ttf";    //字体
  87.     $x=2;
  88.     $session_code='';
  89.     for($i=0;$i<$length;$i++)
  90.     {
  91.         $code=$RANDCODE[mt_rand(0,count($RANDCODE)-1)];
  92.      imagettftext($image,18,mt_rand(-6,6),$x,29,$font_color,$font_face,gb2utf8($code));
  93.         $x+=30;
  94.         $session_code.=$code;
  95.     }
  96.     @session_start();
  97.     $_SESSION['excode']=$session_code;  //把附加码的值放在session中

  98.     //加入干扰线
  99.     for($i=0;$i<$line_num;$i++)
  100.      imageline($image,mt_rand(0,$image_x),mt_rand(0,$image_y),
  101.                     mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color);
  102. imagerectangle($image,0,0,$image_x-1,$image_y-1,$rectangle_color);  //加个边框
  103. imagepng($image);
  104. imagedestroy($image);
  105. }
  106. create_excode(6);
  107. ?>
复制代码

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

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


出处:http://phpweblog.net/
回复

使用道具 举报

 楼主| 发表于 2007-4-8 10:52 | 显示全部楼层
原帖由 brilon 于 2007-4-6 09:00 发表
JAVA图形验证。。有吗。。。我也找找资料。。


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

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

  37.   %>  
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-6-6 12:19

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表