MVC---水印图和验证码

Posted PHP菜鸟进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVC---水印图和验证码相关的知识,希望对你有一定的参考价值。

水印图

  1. 根据后缀判断获取图片的函数

  2. 获取原图和水印图的信息

  3. 拼接新图路径

  4. 生成水印图

  5. 根据后缀名保存水印图

  6. 销毁原图和水印图像资源

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在原图上,这里是把水印图放在了原图右下角;最后保存图片、销毁资源。

验证码

  1. 组装随机字符;

  2. 画图像imagecreatetruecolor();

  3. 定义背景、边框和字体颜色;

  4. 画背景imagefilledrectangle();

  5. 画边框imagerectangle();

  6. 画干扰线imageline();/imagearc();

  7. 画干扰点imagesetpixel();

  8. 画验证码imagefttext();

  9. 设置显示方式;

  10. 显示图像;

  11. 销毁图像;

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程序:

  1. a.php

  <?php    setcookie('a','abc');    
   echo $_COOKIE['a'];    
   unset($_COOKIE);  
 ?>
  1. b.php

  <?php     
   echo $_COOKIE['a'];  
 ?>

先清空一次浏览器cookie,打开a.php,输出什么?再打开b.php,输出什么?

  1. 因为cookie是设置在客户端的,setcookie自己并不能设置cookie,它只能通过头信息请求浏览器设置。

  2. 在浏览器带来的“小饼干”中搜索键为a的cookie,并返回值

清空浏览器cookie打开a.php时,键为a的cookie不存在,因为客户端访问服务器的时候,这个cookie还没做好呢,第一步设置的头信息也没有返回给客户端(php从上到下把语句执行完才返回)。

 因此,a.php:null并且报Notice。b.php:abc 


以上是关于MVC---水印图和验证码的主要内容,如果未能解决你的问题,请参考以下文章

webform:图片水印验证码制作

上传带水印的图片图片验证码

水印,图片验证码

水印,图片验证码

水印,图片验证码

.NET加水印/验证码的NuGet包