MVC---水印图和验证码
Posted PHP菜鸟进阶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVC---水印图和验证码相关的知识,希望对你有一定的参考价值。
水印图
根据后缀判断获取图片的函数
获取原图和水印图的信息
拼接新图路径
生成水印图
根据后缀名保存水印图
销毁原图和水印图像资源
function water($dst_file,$water_file="public/water.png"){
switch(substr($dst_file,strrpos($dst_file,'.')+1)){
case 'jpg':
$dst_im = imagecreatefromjpeg($dst_file);
$water_im = imagecreatefrompng($water_file);break;
case 'jpeg':
$dst_im = imagecreatefromjpeg($dst_file);
$water_im = imagecreatefrompng($water_file);break;
case 'png':
$dst_im = imagecreatefrompng($dst_file);
$water_im = imagecreatefrompng($water_file);break;
case 'gif':
$dst_im = imagecreatefromgif($dst_file);
$water_im = imagecreatefrompng($water_file);break;
}
$dst_info = getimagesize($dst_file);
$water_info = getimagesize($water_file);
$suffix = trim(strrchr($dst_file,'.'),'.');
$num = strrpos($dst_file,'.');
$path = substr($dst_file,0,$num).time().mt_rand(0,999).'.'.$suffix;
$showX = $dst_info[0]-$water_info[0];
$showY = $dst_info[1]-$water_info[1];
imagecopy($dst_im,$water_im,$showX,$showY,0,0,$water_info[0],$water_info[1]);
switch ($suffix) {
case 'jpeg': imagejpeg($dst_im,$path); break;
case 'png' : imagepng($dst_im,$path); break;
case 'gif' : imagegif($dst_im,$path); break;
}
imagedestroy($dst_im);
imagedestroy($water_im);
return $path;
}
将原图和水印图路径作为形参,根据原图后缀名使用不同函数获取图片和信息;将拼接好的新路径保存在$path中;imagecopy()是把水印图copy在原图上,这里是把水印图放在了原图右下角;最后保存图片、销毁资源。
验证码
组装随机字符;
画图像imagecreatetruecolor();
定义背景、边框和字体颜色;
画背景imagefilledrectangle();
画边框imagerectangle();
画干扰线imageline();/imagearc();
画干扰点imagesetpixel();
画验证码imagefttext();
设置显示方式;
显示图像;
销毁图像;
function vcode($num = 4,$size = 14,$width = 0,$height = 0){
if(empty($width)){
$width = 100;
}
if(empty($height)){
$height = 50;
}
$str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
$code = '';
for($i=0;$i<$num;$i++){
$code .= $str[mt_rand(0,strlen($str)-1)];
}
$image = imagecreatetruecolor($width, $height);
$back_color = imagecolorallocate($image, 230, 230, 230);
$bord_color = imagecolorallocate($image, 156,157,158);
$text_color = imagecolorallocate($image, mt_rand(10,100),mt_rand(10,100),mt_rand(10,100));
imagefilledrectangle($image,0,0,$width,$height,$back_color);
imagerectangle($image,0,0,$width-1,$height-1,$bord_color);
for($i=0;$i<30;$i++){
$line_color = imagecolorallocate($image, mt_rand(10,200),mt_rand(10,200),mt_rand(10,200));
imageline($image,mt_rand(-$width,$width),mt_rand(-$height,$height),mt_rand(0,$width),mt_rand(0,$height),$line_color);
}
for($i=0;$i<50;$i++){
$dote_color = imagecolorallocate($image, mt_rand(10,200),mt_rand(10,200),mt_rand(10,200));
imagesetpixel($image,mt_rand(-$width,$width),mt_rand(-$height,$height),$dote_color);
}
imagefttext($image,$size,0,($width/2)-($width/3),($height/2)+($size/2),$text_color,"public/ariblk.ttf",$code);
$_SESSION['code'] = strtolower($code);
header("Cache-Control:max-age=1,s-maxage=1,no-cache,must-revalidate");
header("Content-type:image/png;charset=utf8");
ob_clean();
imagepng($image);
imagedestroy($image);
}
上线后有时候验证码会显示不出来,所以使用ob_clean()先清除缓存.
关于cookie
假设有两个php程序:
a.php
<?php setcookie('a','abc');
echo $_COOKIE['a'];
unset($_COOKIE);
?>
b.php
<?php
echo $_COOKIE['a'];
?>
先清空一次浏览器cookie,打开a.php,输出什么?再打开b.php,输出什么?
因为cookie是设置在客户端的,setcookie自己并不能设置cookie,它只能通过头信息请求浏览器设置。
在浏览器带来的“小饼干”中搜索键为a的cookie,并返回值
清空浏览器cookie打开a.php时,键为a的cookie不存在,因为客户端访问服务器的时候,这个cookie还没做好呢,第一步设置的头信息也没有返回给客户端(php从上到下把语句执行完才返回)。
因此,a.php:null并且报Notice。b.php:abc
以上是关于MVC---水印图和验证码的主要内容,如果未能解决你的问题,请参考以下文章