首页 > 编程语言 >php 滑动图片验证生成

php 滑动图片验证生成

时间:2022-12-19 14:00:12浏览次数:38  
标签:src 原图 验证 dst jigsaw im 滑动 php local

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);
                }
            }
        }
    }

}

 

标签:src,原图,验证,dst,jigsaw,im,滑动,php,local
From: https://www.cnblogs.com/death-/p/16991973.html

相关文章

  • 【实践】高性能PHP应用容器workerman快速入门
    前言workerman--极简、稳定、高性能、分布式workerman是什么workerman是一款开源高性能PHP应用容器,它大大突破了传统PHP应用范围,被广泛的用于互联网、即时通讯、APP开发、硬......
  • Android Studio使用Mob实现短信验证功能遇到的问题解决
    一、Mob短信验证​​全球领先的数据智能科技平台-MobTech袤博解决​​进行注册登入 登入成功后,点击开发者服务中的短信验证,进入开发者平台填好信息创建成功后显示下图,可以......
  • docker php容器安装swoole扩展
    swoole安装包下载地址我下载的是5.0.1的查看容器名称1#进入容器2dockerexec-itrun-php-81-fpm/bin/bash34#默认没有/usr/src/php需要通过docker-p......
  • PHP-Laravel支付宝支付和微信支付
    支付宝注册首先要注册两个平台账号,一个是支付宝商户平台,一个是支付宝开放平台,需要企业账号实名认证,免费。没有条件的可以是用支付宝模拟沙箱进行测试。开发前置支......
  • 验证码是自动化的天敌?看看大神是怎么解决的
     每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:magetest码同学抖音号:小码哥聊软件测试01验......
  • ASP.NET 实现验证码以及刷新验证码的小例子
    原文链接:https://www.jb51.net/article/42219.htm实现代码///<summary>   ///生成验证码图片,保存session名称VerificationCode   ///</summary>   pu......
  • ASP.NET验证码实现代码(C#)
    原文链接:https://www.jb51.net/article/13634.htm1、创建空白页面CheckCode.aspxpublicpartialclassCheckCode:System.Web.UI.Page{privatevoidPage_Load(......
  • Debugging techniques for PHP programmers
    Tableofcontents​​Introduction​​​​Settingup​​​​Errormessages​​​​Introducingprintstatements​​​​UsingPHPeclipse​​​​Usingthedebugge......
  • 交叉验证与网格搜索
    一、概述1.1为什么用网格搜索与交叉验证在机器学习中,有大量的超参数需要指定;如果超参数指定不合适,则会出现过拟合和欠拟合。而指定超参数,一种方法是凭经验;一种方法是穷......
  • java验证码组件Jcaptcha
    Jcaptcha验证码生成组件用法1.创建项目JcaptchaDemo2.引入相关.jar文件jcaptcha-1.0-all.jar;commons-logging-1.0.4.jar;commons-collections-2.1.1.jar3.创建GMailEngine,仿......