1.话不多说,直接干货,喜欢的希望大家一键三连

<?php

namespace App\Model;

class VerifyImage
{
//浮层坐标数组
protected $tailoringArray = [];
//浮层图宽
protected $picW = 100;
//浮层图高
protected $picH = 100;
//浮层图圆半径
protected $r = 10; //截图小图路径
protected $tailoringSmallSavePath;
//截图大图路径
protected $tailoringBigSavePath; //截图小图图片名称
protected $tailoringSmallName;
//截图大图图片名称
protected $tailoringBigName; //图片后缀
protected $picSuffix = '.png'; //原图路径
protected $srcPic;
//原图信息
protected $picInfo; //图片保存路径
protected $picSavePath;
//资源图片路径
protected $resourcesPath; //初始化相关数据
public function init()
{
$this->resourcesPath = BASE_PATH . '/static/code/';
//背景图片存放目录 (Resources)
$dir = BASE_PATH . '/static/images/code/' . date('YmdH');
//被处理图片 存放目录(裁剪小图,错位背景图)
$this->tailoringBigSavePath = $dir . '/big/';
$this->tailoringSmallSavePath = $dir . '/small/';
$this->getRandomPng();
$this->tailoringSmallName = $this->tailoringSmallSavePath . md5(uniqid()) . $this->picSuffix;
$this->tailoringBigName = $this->tailoringBigSavePath . md5(uniqid() . time()) . $this->picSuffix;
//检查目录是否存在
if (!file_exists($this->tailoringBigSavePath)) {
mkdir($this->tailoringBigSavePath, 0777, true);
}
if (!file_exists($this->tailoringSmallSavePath)) {
mkdir($this->tailoringSmallSavePath, 0777, true);
}
//删除过时资源图片
$this->picSavePath = dirname($dir);
//删除一小时之前图片
$this->deleteHourXSVerificationImage($this->picSavePath);
} public function __construct()
{
$this->init();
// 获取原图的 宽高
$this->picInfo = $this->getPicWidthHeight($this->srcPic);
$this->getTailoringImage();
} // 获取图片宽、高
public function getPicWidthHeight($pic_path)
{
$lim_size = getimagesize($pic_path);
return array('w' => $lim_size[0], 'h' => $lim_size[1]);
} //随机获取参照图片
private function getRandomPng()
{
$this->srcPic = $this->resourcesPath . $this->tailoringBigName . mt_rand(1, 4) . '.png'; echo $this->srcPic;
if (!file_exists($this->srcPic)) {
throw new \Exception('图片资源不存在!!!');
} else {
return $this->srcPic;
}
} //获取浮层图片
public function getTailoringImage(){ $dr = $this->r*$this->r; //半径平方
$local_w = $this->r*2-5;
//第一个圆中心点
$circular1_x = $local_w+($this->picW-($local_w)*2)/2;
$circular1_y = $this->r;
//第二个圆中心点
$circular2_x = $this->picH-$this->r;
$circular2_y = $local_w+($this->picH-($local_w)*2)/2;; for($i=0;$i<$this->picH;$i++){
for($j=0;$j<$this->picW;$j++){
//根据公式(x-a)²+(y-b)² = r² 算出像素是否在圆内
$d1 = pow($j-$circular1_x,2)+pow($i-$circular1_y,2);
$d2 = pow($j-$circular2_x,2)+pow($i-$circular2_y,2); if(($i>=$local_w && $j>=$local_w && $i<=$this->picH-$local_w && $j<=$this->picW-$local_w) || $d1<=$dr || $d2<=$dr){
$this->tailoringArray[$i][$j] = 1; //在拼图内为1
} else {
$this->tailoringArray[$i][$j] = 0; //在拼图外为0
}
}
}
} // 创建背景图和浮层图、浮层图x,y坐标
public function createImage(){
//原图
$srcFile = $this->srcPic;
$src_w = $this->picInfo['w']; //原图宽
$src_h = $this->picInfo['h']; //原图高
$src_im = imagecreatefrompng($srcFile); $dst_im = imagecreatetruecolor($src_w,$src_h);
//根据原图尺寸创建一个相同大小的真彩色位图
//给新图填充背景色
$black = imagecolorallocate($dst_im,0,0,0);//黑
imagefill($dst_im,0,0,$black);
imagecopymerge($dst_im,$src_im,0,0,0,0,$src_w,$src_h,100);//原图图像写入新建真彩位图中 //生成透明底拼图画布
$jigsaw_im = imagecreatetruecolor($this->picW,$this->picH); //100*100拼图画布
imagealphablending($jigsaw_im,false);
imagesavealpha($jigsaw_im, true);
$jigsaw_bg = imagecolorallocatealpha($jigsaw_im,0,0,0,127);
imagefill($jigsaw_im, 0, 0, $jigsaw_bg); //随机位置
$src_x = mt_rand(215,$src_w-$this->picW); //水印位于大图x坐标
$src_y= mt_rand(0,$src_h-35); //y坐标 $this->rgb_white = imagecolorallocatealpha($dst_im,127,127,127,60); //灰色水印
//循环轮廓抠图
for($i=0;$i<$this->picH;$i++){
for ($j=0;$j<$this->picW;$j++){
if($this->tailoringArray[$i][$j] == 1){
//如果在轮廓内,取原图像素颜色
$this->rgb = ImageColorAt($dst_im,$src_x+$j,$src_y+$i);
imagesetpixel($jigsaw_im,$j,$i,$this->rgb); //在拼图画布上色
//在原图挖坑(打上灰色)
imagesetpixel($dst_im,$src_x+$j,$src_y+$i,$this->rgb_white);
}
}
} //保存图片
imagepng($dst_im,$this->tailoringBigName);
imagepng($jigsaw_im,$this->tailoringSmallName);
imagedestroy($src_im);
imagedestroy($dst_im);
imagedestroy($jigsaw_im); return ['tailoringBgImage'=>$this->tailoringBigName,'tailoringImage'=>$this->tailoringSmallName,'x'=>$src_x,'y'=>$src_y];
} // 删除一小时之前的 验证码图片
public function deleteHourXSVerificationImage($dir)
{
$op = dir($dir);
$time = date("YmdH", strtotime("-1 hours"));
$i = 0;
while (false != ($item = $op->read()) && $i <= 10) {
$i++;
if ($item == '.' || $item == '..') {
continue;
}
if (is_numeric($item) && $item <= $time || !is_numeric($item)) {
if (is_dir($op->path . '/' . $item) && rmdir($op->path . '/' . $item) == false) {
$this->deleteHourXSVerificationImage($op->path . '/' . $item);
} else {
echo $op->path . '/' . $item;
unlink($op->path . '/' . $item);
}
}
}
} }

php 滑动图片验证生成的更多相关文章

  1. 滑动验证 和滑动图片验证JS

    滑动验证 先放效果图 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  2. c# 简单的滑动图片验证

    普通的验证码对用户使用体验不友好,出现了滑动图片验证的验证方式,用户只要按住滑块完成图片的拼接即可通过验证(这是最简单的方式,滑动轨迹,数据分析,滑行速度 什么的暂没考虑) 主要的实现思路: 1.先从 ...

  3. 完整说明使用SpringBoot+js实现滑动图片验证

    常见的网站验证方式有手机短信验证,图片字符验证,滑块验证,滑块图片验证.本文主要讲解的是滑块图片验证的实现流程.包括后台和前端的实现. 实现效果 使用的API java.awt.image.Buffe ...

  4. react使用ant design pro时的滑动图片组件

    react的滑动图片验证,是基于https://segmentfault.com/a/1190000018309458?utm_source=tag-newest做的修改,改动的主要有以下几点: 1. ...

  5. 极验反爬虫防护分析之slide验证方式下图片的处理及滑动轨迹的生成思路

    本文要分享的内容是去年为了抢鞋而分析 极验(GeeTest)反爬虫防护的笔记,由于篇幅较长(为了多混点CB)我会按照我的分析顺序,分成如下四个主题与大家分享: 极验反爬虫防护分析之交互流程分析 极验反 ...

  6. php 图片验证码生成 前后台验证

    自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一下,希望大家在用到相关问题的时候可以有一定的参考性. 首先,php验证码生成. 代码如下: 1.生成图像代 ...

  7. appium 学习各种小功能总结--功能有《滑动图片、保存截图、验证元素是否存在、》---新手总结(大牛勿喷,新手互相交流)

    1.首页滑动图片点击 /** * This Method for swipe Left * 大距离滑动 width/6 除数越大向左滑动距离也越大. * width:720 *height:1280 ...

  8. [转]php 图片验证码生成 前后台验证

    本文转自:https://www.cnblogs.com/xiaoyezi/p/3541195.html 自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一 ...

  9. Python实现图片滑动式验证识别

    1 abstract 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类 ...

  10. 极验3.0滑动拼图验证的使用--java

    [ 前言: 在登录其他网站的时候,看到有个滑动拼图的验证觉得挺好玩的,以前做一个图片验证的小demo,现在发现很多网站都开始流行滑动拼图的验证了,今天也想自己动手来弄一个. 废话不多说,开始撸起来! ...

随机推荐

  1. Day 13 13.1 refer反爬

    Referer 一.referer是什么: 图片防盗链的技术应该还有其他的,目前了解到的是浏览器的referer,其实这是错误的拼写,正确是应该是referrer.不过现在可以看到Chrome的开发者 ...

  2. 前端下载图片、pdf、excel、world文件;前端下载图片和pdf文件;前端a标签下载图片和pdf文件;下载文件名称不生效原因

    https://blog.csdn.net/i_am_a_div/article/details/125050379 https://blog.csdn.net/moguzhale/article/d ...

  3. JavaWeb 之 Cookie

    0x01:为什么会有Cookies? 早期的互联网只是单纯的浏览信息,就像一个窗口一样,可以看但是没办法触摸到外面的风景,即是所谓的没有交互. 慢慢发展逐渐有了交互式Web,这里提一嘴HTTP无状态( ...

  4. leetcode刷题(三)

    1.图论 找到小镇的法官 在一个小镇里,按从 1 到 N 标记了 N 个人.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相信任何人.每个人(除了小镇法官外) ...

  5. Python语言基础实验(第四周)

    Python语言基础实验(第四周) 一.实验目的 1.了解并掌握python中序列及序列的常用操作. 2.根据实际需要运用合适的序列类型来完成实验. 二.实验环境 软件版本:Python 3.10 6 ...

  6. EF和dapper

    EF:重量级ORM的代表 优点: 1.不关心sql怎么写, 2.开发速度快,和linq结合,有效提高开发效率 3.code first,代码优先,不用关心数据库结构,代码先行. 4.跨数据库,只需要把 ...

  7. Wordpress后台网址安全

    wordpress 固定的后台地址是 网站/wp-admin/ 如果对方知道你是wp建站,然后很自然的就能知道你后台登录地址.然而你密码简单的话,很容易被黑. 所以为了安全考虑,我们需要把这个默认地址 ...

  8. liunx常用命令必备,持续更新

    inux中的命令的确是非常多,但是只需要掌握我们最常用的命令足够完成我们的工作了. 1.切换超级用户与普通用户 默认登录的是普通用户权限显示$符从普通用户切换超级用户权限:sudo su输入密码 从超 ...

  9. 题解[HEOI2013]SAO.md

    题意 给定一棵树,边有方向.要给点重标号,使得边都由小编号指向大编号,求重标号方案数. \(n\le10^5\) 思路 有关树的计数.套路性考虑树形 DP. 设计状态 \(f_{u}\) 表示 \(u ...

  10. python批量将png图片转换为jpg图片

    参考引用链接如下:https://www.freesion.com/article/1866518882