PHP用GD库创建缩略图以及生成验证码图片

今天分享了PHP生成水印的方法,闲来无事,在提供一个生成验证码和缩略图的方法(方法不唯一),可以自主控制缩略图大小和验证码个数以及验证码的易辩性。 至于GD库怎么打开和php运用GD库的一些方法,可以参考我之前的文章。

一、生成缩略图

1、用到的关键语法:
imagecopyresampled(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h) :将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因此,尤其是,减小了图像的大小而仍然保持了极大的清晰度。

dst_image:目标图象连接资源。

src_image:源图象连接资源。

dst_x:目标 X 坐标点。

dst_y:目标Y坐标点。

src_x:源的 X 坐标点。

src_y:源的 Y 坐标点。

dst_w:目标宽度。

dst_h:目标高度。

src_w:源图象的宽度。

src_h:源图象的高度。(建议大家设个值研究一下,光看是没用的)

imagecreatetruecolor(): 返回一个图像标识符,代表了一幅大小为 x_size 和y_size 的黑色图像。

mage_type_to_mime_type:取得 getimagesize,exif_read_data,exif_thumbnail,exif_imagetype 所返回的图像类型的 MIME 类型。

生成缩略图代码(代码有详细注释):
//看过上一篇生成文字水印和图片水印的朋友,应该对我的变量命名方式有些了解
$filename="images/logo.jpg";//目标图片
list($src_w,$src_h,$imagetype)=getimagesize($filename);//获取图片信息,把宽高用list方式存储
$scale=0.5//设置缩略图缩放比例
//假如事先设定好缩略图,就可以在前面设置$dst_w,$dst_h的大小,就不需要下面一步用缩放比例生成缩略图了
if(is_null($dst_w)||is_null($dst_h)){
	$dst_w=ceil($src_w*$scale);//ceil向上取整
	$dst_h=ceil($src_h*$scale);
}
$mime=image_type_to_mime_type($imagetype);//这里获取list存储的目标图片mime类型
$createFun=str_replace("/", "createfrom", $mime);//将$mime中的/换成createfrom
$src_image=$createFun($filename);//生成图片
$dst_image=imagecreatetruecolor($dst_w, $dst_h);//根据缩略图宽高生成一个真色彩图像
imagecopyresampled($dst_image, $src_image, 0,0,0,0, $dst_w, $dst_h, $src_w, $src_h);
$destination="images/";//这里指的是图像存储路径
//假如给的路径不存在,下面会自动产生上面一行给出的路径
if(!$destination&&!file_exists(dirname($destination))){
	mkdir(dirname($destination),0777,true);
}
//此函数生成一个唯一字符串
function getUniName(){
	return md5(uniqid(microtime(true),true));
}
//此函数得到文件扩展名
function getExt($filename){
	return strtolower(end(explode(".",$filename)));
}
$dstFilename=$destination==null?getUniName().".".getExt($filename):$destination;//生成一个唯一的名字作为新图片名字
$outFun=str_replace("/", null, $mime);//将$mime中的/换成空
$outFun($dst_image,$dstFilename);//这里经过上面的变换,假如$mime=image/gif,那$outFun就等于imagegif,$outFun()就是imagegif()函数。并且默认把文件存到$dstFilename路径
imagedestroy($src_image);//销毁资源,释放内存
imagedestroy($dst_image);
$isReservedSource=true//是否存储,是的话下面就不会执行消除
if(!$isReservedSource){
	unlink($filename);
}
上面用的str_replace()函数做替换讲的可能不很清楚,大家可以看我的这篇文章,里面有详细介绍: 《PHP中用GD库和imagecopy()或者imagecopymerge()函数给图片添加文字水印或图片水印

二、生成验证码

1、所需知识点 session_start()函数:用$_SESION之前必须要session_start()—-其中之一的功能,$_SESSION是服务器端的cookie,相当一个大数组(浏览器关闭前,和session销毁前)$_SESSION中的数据可以一直用(除了重新赋值)。$_SESSION 好比一个数组 $_SESSION[‘name’] = ‘那樊笼’ 这好比在数组中加了一个元素,相当于$_SESSION = array(“name”=>”那樊笼”) 使用的时候 还要使用$_SESSION[‘name’] 才能得到’那樊笼’。 imagecolorallocate ( image , red , green , blue ):imagecolorallocate() 返回一个标识符,代表了由给定的 RGB 成分组成的颜色。red,green 和 blue 分别是所需要的颜色的红,绿,蓝成分。这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。 imagefilledrectangle ( image , x1 , y1 , x2 , y2 , color ):在 image 图像中画一个用 color 颜色填充了的矩形,其左上角坐标为 x1,y1,右下角坐标为 x2,y2。0, 0 是图像的最左上角。 imagesetpixel (image , x , y , color ):在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。 imageline ( image , x1 , y1 , x2 , iy2 , color ):用color 颜色在图像 image 中从坐标 x1,y1 到x2,y2(图像左上角为 0, 0)画一条线段。 2、代码详解 首先先设定验证码类型和长度
//$type 自定义类型,设置数字验证码还是字母验证码还是数字字母混搭
//$length 自定义验证码字符个数
function buildRandomString($type,$length){
if ($type == 1) {
		$chars = join ( "", range ( 0, 9 ) );
	} elseif ($type == 2) {
		$chars = join ( "", array_merge ( range ( "a", "z" ), range ( "A", "Z" ) ) );
	} elseif ($type == 3) {
		$chars = join ( "", array_merge ( range ( "a", "z" ), range ( "A", "Z" ), range ( 0, 9 ) ) );
	}
	if ($length > strlen ( $chars )) {
		exit ( "字符串长度不够" );
	}
	$chars = str_shuffle ( $chars );
	return substr ( $chars, 0, $length );
}
然后生成验证码
//通过GD库做验证码
$type=3;
$length=4;
$sess_name = "verify";//给你做的验证码起个名字
session_start();//开启session
//创建画布
$width = 80;//这个根据具体需要设置大小
$height = 28;
$image = imagecreatetruecolor ( $width, $height );
$white = imagecolorallocate ( $image, 255, 255, 255 );
$black = imagecolorallocate ( $image, 0, 0, 0 );
//用填充矩形填充画布
imagefilledrectangle ( $image, 1, 1, $width - 2, $height - 2, $white );
$chars = buildRandomString ( $type, $length );
$_SESSION [$sess_name] = $chars;
$fontfiles = array ("msyh.ttf" );//这是我电脑里下载的一个字体
//如果有需要的朋友可以自己添加字体,字体在你的电脑中的fonts文件夹里有,直接运行输入fonts就能看到相应字体
for($i = 0; $i < $length; $i ++) {
	$size = mt_rand ( 14, 18 );
	$angle = mt_rand ( - 15, 15 );
	$x = 5 + $i * $size;
	$y = mt_rand ( 20, 26 );
	$fontfile = "./" . $fontfiles [mt_rand ( 0, count ( $fontfiles ) - 1 )];
	$color = imagecolorallocate ( $image, mt_rand ( 50, 90 ), mt_rand ( 80, 200 ), mt_rand ( 90, 180 ) );
	$text = substr ( $chars, $i, 1 );
	imagettftext ( $image, $size, $angle, $x, $y, $color, $fontfile, $text );
}
//这是给验证码加点,可以自己设置点的个数
$pixel=10;
if ($pixel) {
	for($i = 0; $i < $pixel; $i ++) {
		imagesetpixel ( $image, mt_rand ( 0, $width - 1 ), mt_rand ( 0, $height - 1 ), $black );
	}
}
//给验证码加线条,可以自己设置线的个数
$line=3;
if ($line) {
	for($i = 1; $i < $line; $i ++) {
		$color = imagecolorallocate ( $image, mt_rand ( 50, 90 ), mt_rand ( 80, 200 ), mt_rand ( 90, 180 ) );
		imageline ( $image, mt_rand ( 0, $width - 1 ), mt_rand ( 0, $height - 1 ), mt_rand ( 0, $width - 1 ), mt_rand ( 0, $height - 1 ), $color );
	}
}
header ( "content-type:image/gif" );
imagegif ( $image );
imagedestroy ( $image );
这下子就大功告成了,生成的验证码用$_SESSION接收一下,前端输入的用$_POST接受然后判断一下,大功告成:
$identifying_code = $_POST['verify'];//verify是上面给验证码起的名字并且用$_SESSION存起来的 
$identifying_code1 = $_SESSION['verify']; 
if (strcasecmp  ($identifying_code ,$identifying_code1) == 0)(如果验证码输对了,if就返回的true,后面的就根据需要自己来写)
生成的验证码: QQ图片20150611010855 接下来我将上面的代码封装成了对应的几个的函数,需要的可以直接拿来用, 下面是下载链接: VerifyImage.php

扩展

PHP中SESSION和COOKIE的原理和关系: 1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。 2、session中保存的是对象,cookie中保存的是字符串。 3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置 了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。 4、session默认需要借助cookie才能正常工作。如果客户端完全禁止cookie,session,这种方法将失效。但是如果服务器端启用了url编码,也就是用URLEncoder.encode("index.jsp?id=3","UTF-8");..把所有的url编码了,则会在url后面出现如下类似的东西index.jsp:jsessionid=fdsaffjdlksfd124324lkdjsf?id=3服务器通过这个进行session的判断。 5、session在用户会话结束后就会关闭了,但cookie因为保存在客户端,可以长期保存 6、cookie:是服务端向客户端写入的小的片段信息。cookie信息保存在服务器缓存区,不会在客户端显现。当你第一次登陆一个网站,服务器向你的机器写得片段信息。你可以在Internet选项中找到存放cookie的文件夹。如果不删除,cookie就一直在这个文件夹中。

参考文章

关于session详解:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html 关于cookie详解:http://blog.csdn.net/vs2008aspnet/article/details/8267620 cookie和session区别:http://www.cnblogs.com/windows/articles/1605634.html 今后会持续更新文章,如果我写的文章有什么地方有错误或者有更好的实现办法的,请在下面留言,留言会邮箱通知我,我会仔细地看并回复的~
标签:   |  
时间: 2015年06月11日上午1:18  |  
作者:
LEAVE A REPLY
loading
正在赶回来……