php实现拼图滑块验证的思考及部分实现
时间:2019-06-15
本文章向大家介绍php实现拼图滑块验证的思考及部分实现,主要包括php实现拼图滑块验证的思考及部分实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现拼图滑块验证,我觉得其中比较关键的一点就是裁剪图片,最起码需要裁剪出下面两张图的样子
底图
滑块图
一张底图和一张滑块图,其中底图实现起来比较简单可以使用添加水印的方式直接将一张拼图形状的半透明图与一张底图合并起来就可以啦,但是实现滑块图就不能够直接使用某个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); ?>
原文地址:https://www.cnblogs.com/itsuibi/p/11010826.html
- @ResponseBody响应JSON 406
- tomcat不能运行或共存多个项目
- Spring Task 定时任务
- 如何为机器学习索引,切片,调整 NumPy 数组
- 逆向工程分析:摩托罗拉安全摄像头究竟有多不安全?
- 【maven学习】 利用Profile构建不同环境的部署包
- 如何写好一份渗透测试报告?
- jqGrid 关闭刷新父页面数据
- [MyBatis]诡异的Invalid bound statement (not found)错误
- jfinal自定义freemarker标签
- Angrok 一个内网穿透服务
- Druid数据库连接池 实现数据库账号密码加密
- 【maven学习】划分模块
- 缓存策略优化
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 详解 Numpy 中的视图和副本
- 详解 matplotlib 中的两种标注方法
- 混搭 TypeScript + GraphQL + DI + Decorator 风格写 Node.js 应用
- 彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!
- Kubernetes控制器--副本集ReplicaSet
- Awesome Kubernetes 系列:第一期
- Mongodb多键索引之数组文档
- 在 Cocos Creator 里画个炫酷的雷达图
- 用shader做一个柿子颜色的过场动画
- mysql 找出最新时间的一条数据
- 【NPM库】- 0x05 - 文件、路径操作
- MySQL中insert阻塞问题的分析
- Fedora32下编译安装Qemu5.1并创建ARM版本Linux虚拟机
- 面试官想问的HashMap,都在这一篇里面了!
- CentOS7下使用Mondo Rescue实现系统全备份