实现拼图滑块验证,我觉得其中比较关键的一点就是裁剪图片,最起码需要裁剪出下面两张图的样子

底图

滑块图

一张底图和一张滑块图,其中底图实现起来比较简单可以使用添加水印的方式直接将一张拼图形状的半透明图与一张底图合并起来就可以啦,但是实现滑块图就不能够直接使用某个php提供的函数来直接实现啦,但是这也不是不能完成的事情,大致思路如下:

1.准备好拼图形状的一张滑块模型图,例如

然后创建一个相同大小的透明图片

list($width_z, $height_z, $type_z, $attr_z) = getimagesize(滑块模型地址);
$img = imagecreatetruecolor($width_z, $height_z);
imagesavealpha($img, true);
$bg = imagecolorallocatealpha($img, 255, 0, 0, 127);
imagefill($img, 0, 0, $bg);

2.获取底图的像素矩阵(主要获取图片中每个像素的 颜色索引/rgb 的值)

$background = imagecreatefromjpeg(底图图片地址);
list($width_t, $height_t, $type_t, $attr_t) = getimagesize(底图图片地址);
for ($i=0; $i < $width_t; $i++) {
for ($j=0; $j < $height_t; $j++) {
//获取每个像素的颜色索引值
$color2 = imagecolorat($background, $i, $j);
}
}

3.获取滑块模型图的像素矩阵,并获取矩阵中的黑色区域部分的像素点的坐标

list($width_z, $height_z, $type_z, $attr_z) = getimagesize("滑块模型图地址");
$cover = imagecreatefrompng("滑块模型图地址");
for ($i=0; $i < $width_z; $i++) {
for ($j=0; $j < $height_z; $j++) {
//获取每个像素的颜色索引值
$color2 = imagecolorat($cover, $i, $j);
if($color2 == 0){
//此时的 $i 和 $j 分别表示的是黑色区域的像素点的x,y坐标
}
}
}

4.在底图像素矩阵中按照步骤3中获取的坐标结合底图的实际情况获取像素值

5.将步骤4中获取的像素值,逐个设置到步骤1生成的透明图片上,这样滑块图就做好啦

//设置指定图像的xy坐标的颜色索引
bool imagesetpixel ( resource $image , int $x , int $y , int $color )

整体代码:

<?php
//遮盖层
list($width_z, $height_z, $type_z, $attr_z) = getimagesize("cover.png");
$cover = imagecreatefrompng("cover.png");
//创建一个和遮盖层同样大小的图片
$img = imagecreatetruecolor($width_z, $height_z);
imagesavealpha($img, true);
$bg = imagecolorallocatealpha($img, 255, 0, 0, 127);
imagefill($img, 0, 0, $bg); //背景层
list($width_t, $height_t, $type_t, $attr_t) = getimagesize("background.jpg"); $background = imagecreatefromjpeg("background.jpg"); $width_max = $width_t-$width_z-10;
$height_max = $height_t-$height_z-10; $width_ini = rand($width_z+10,$width_max);
$height_ini = rand(10,$height_max); $width_limit = $width_ini + $width_z;
$height_limit = $height_ini + $height_z; for ($i=$width_ini; $i < $width_limit; $i++) {
for ($j=$height_ini; $j < $height_limit; $j++) { $color2 = imagecolorat($background, $i, $j); //判断索引值区分具体的遮盖区域
if(imagecolorat($cover, $i-$width_ini, $j-$height_ini) == 0){
imagesetpixel($img, $i-$width_ini, $j-$height_ini, $color2);
} $color1 = imagecolorat($cover, $i-$width_ini, $j-$height_ini);
$s = imagecolorallocatealpha($background, 192, 192, 192, 45);
if($color1 == 0){
imagesetpixel($background,$i,$j,$s);
} }
} //生成背景图
imagepng($background);
//生成滑块图
imagepng($img);
?>

php实现拼图滑块验证的思考及部分实现的更多相关文章

  1. selenium滑块验证

    使用selenium模拟登录解决滑块验证问题   本次主要是使用selenium模拟登录网页端的TX新闻,本来最开始是模拟请求的,但是某一天突然发现,部分账号需要经过滑块验证才能正常登录,如果还是模拟 ...

  2. Java + Selenium + OpenCV解决自动化测试中的滑块验证

    最近工作过程中,一个常用的被测网站突然增加了滑块验证环节,导致整个自动化项目失效了. 为了解决这个滑块验证问题,在网上查阅了一些资料后,总结并实现了解决方案,现记录如下. 1.滑块验证思路 被测对象的 ...

  3. winform 仿web 滑块验证

    winform 仿web 滑块验证 效果如下: 源码下载地址: https://download.csdn.net/download/u011392711/11109687

  4. jQuery手机触屏拖动滑块验证跳转插件

    HTML: <!DOCTYPE html> <html lang="en"> <head> <title>jQuery手机触屏拖动滑 ...

  5. 关于selenium实现滑块验证

    关于selenium实现滑块验证 python2.7+selenium2实现淘宝滑块自动认证参考链接:https://blog.csdn.net/ldg513783697/article/detail ...

  6. 原生js实现拖动滑块验证

    拖动滑块验证是现在的网站随处可见的,各式各样的拖动法都有. 下面实现的是某宝的拖动滑块验证: <!DOCTYPE html> <html lang="en"> ...

  7. js移动端滑块验证解锁组件

    本文修改自PC端的js滑块验证组件,PC端使用的是onmousedown,onmouseup,nomousemove.原文找不到了,也是博客园文章,在此感谢广大网友的生产力吧. 说下对插件和组件的理解 ...

  8. js 拖动滑块验证

    备注:拖动滑块时尽量平移,chrome浏览器上没有卡顿情况,但是搜狗极速模式和360极速模式都遇到了卡顿,拖不动情况,应是浏览器内部对事件响应速度导致吧. JS代码: ;(function ($,wi ...

  9. BILIBILI之滑块验证

    bilibili的滑动验证码图片比较好玩,和前一篇不大一样. 采用canvas方法,分析发现只找到一个图片,不过,可以通过设置display截图方式获得2张图(完整图片,带缺口的图片),取得图片后接下 ...

随机推荐

  1. 文件上传使用FileUpload组件进行代码实现

    使用FileUpload组件进行代码实现 实现步骤 1. 获取解析器工厂: DiskFileItemFactory 2. 获取解析器对象: ServletFileUpload 3. 解析request ...

  2. 总结SQL查询慢的50个原因

    查询速度慢的原因很多,本文总结SQL查询慢的50个原因: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优 ...

  3. C++ STL 排列 next_permutation prev_permutation

    #include <iostream>#include <algorithm>#include <vector> using namespace std; int ...

  4. 图解 HTTP 笔记(三)—— HTTP 报文内的 HTTP 信息

    本章主要讲解请求和响应是如何运作的 一.HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文,客户端的 HTTP 报文叫做请求报文,服务器端的叫做响应报文. HTTP 报文大致可分为报 ...

  5. Swagger下载的zip文件无法打开,而且大小比直接下载的要大

    以前写的一个rest提供的是浏览器下载zip包的功能,前端界面调用rest可以正常地下载. 今天使用Swagger来调试下载功能时,发现下载的zip包打不开,而且大小也比直接在浏览器中输入rest地址 ...

  6. PAT 甲级 1023 Have Fun with Numbers (20 分)(permutation是全排列题目没读懂)

    1023 Have Fun with Numbers (20 分)   Notice that the number 123456789 is a 9-digit number consisting ...

  7. Python 标准库之 fcntl

    在 linux 环境下用 Python 进行项目开发过程中经常会遇到多个进程对同一个文件进行读写问题,而此时就要对文件进行加锁控制,在 Python 的 linux 版本下有个 fcntl 模块可以方 ...

  8. Spark2.4源码阅读1-Shuffle机制概述

    本文参考: a. https://www.jianshu.com/p/c46bfaa5dd15 1. shuffle及历史简介 shuffle,即"洗牌",所有采用map-redu ...

  9. linux ssh利用公钥免密登陆

    1.安装检查ssh 如果没有ssh的话,需要安装 #yum  install -y openssh-server openssh-clients 2.生成秘钥 ssh-keygen -t rsa 执行 ...

  10. python、java、ruby、node等如何提取office文档中的内容?

    我相信大家都有过这样的需求,把doc.ppt.excel.pdf.txt中的文本内容提取出来.提取出来的文本内容可用于文档内容的全文索引,文档的基本内容摘要等.在度娘上搜索“如何提取文档内容”,确实有 ...