[已解决][补充部分原理]关于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 编辑 ] 引用图片的问题/?? 用了网上其它的代码
没有引用图片
生成的还是个叉 用迅雷下载:
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 编辑 ] 把编码改为 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 编辑 ] 又和编码有关?
最烦的就是编码啦! 刚刚试了下中文,
乱码....
image.php?text=中文
得到的不是中文两个字,而是四个乱码。。。
试过
header("content-type:image/jpeg;charset=gb2312");无效... JAVA图形验证。。有吗。。。我也找找资料。。 $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 发表
可以在图里面显示中文吗?
试试先..
可能不行...没试过.当时只是输出数字到图片上.
因为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/ 原帖由 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]