python之滑动认证(图片)
from PIL import Image, ImageEnhance
from io import BytesIO def cutImg(imgsrc):
"""
根据坐标位置剪切图片
:param imgsrc: 原始图片路径(str)
:param out_img_name: 剪切输出图片路径(str)
:param coordinate: 原始图片上的坐标(tuple) egg:(x, y, w, h) ---> x,y为矩形左上角坐标, w,h为右下角坐标
:return: from PIL import Image
from PIL import ImageEnhance
#原始图像
image = Image.open('lena.jpg')
image.show()
#亮度增强
enh_bri = ImageEnhance.Brightness(image)
brightness = 1.5
image_brightened = enh_bri.enhance(brightness)
image_brightened.show()
#色度增强
enh_col = ImageEnhance.Color(image)
color = 1.5
image_colored = enh_col.enhance(color)
image_colored.show()
#对比度增强
enh_con = ImageEnhance.Contrast(image)
contrast = 1.5
image_contrasted = enh_con.enhance(contrast)
image_contrasted.show()
#锐度增强
enh_sha = ImageEnhance.Sharpness(image)
sharpness = 3.0
image_sharped = enh_sha.enhance(sharpness)
image_sharped.show() """ # image.save(buffered, format="PNG")
# img_str = base64.b64encode(buffered.getvalue()) x=random.randint(100,260)
y=random.randint(0,80)
w=x+40
h=y+40
coordinate=(x,y,w,h) image = Image.open(imgsrc)
region = image.crop(coordinate)
region = ImageEnhance.Contrast(region).enhance(1.0)
# region2 = ImageEnhance.Contrast(region).enhance(0.1)
region2 = ImageEnhance.Brightness(region).enhance(0.5)
region2.show()
buffered = BytesIO()
region.save(buffered, format="PNG")
img_paste = base64.b64encode(buffered.getvalue()).decode()
buffered.close() image.paste(region2, (x, y))
buffered2 = BytesIO()
image.save(buffered2, format="PNG")
img_bg=base64.b64encode(buffered2.getvalue()).decode()
buffered2.close()
封装成方法
import os
from PIL import Image, ImageEnhance
from io import BytesIO
import base64
import random
import uuid def isint(self, *args):
for nb in args:
try:
int(nb)
except Exception as e:
return (False, nb)
return (True, '') # redis key值开头
prefix_str = "phoebe_auth_" imgpath = os.path.join(os.path.dirname(__file__), '..', 'silder_img') #获取滑动认证的图片
def getAuthImage(redis_conn,uid):
if os.path.isdir(imgpath) is False:
return (False,'{} 不存在'.format(imgpath)) img_list = os.listdir(imgpath)
if img_list:
random_img = img_list[random.randint(0, len(img_list) - 1)]
imgscr = os.path.join(imgpath, random_img)
else:
return (False, '{} 不存在'.format(imgpath)) image = Image.open(imgscr)
width = image.size[0]
height = image.size[1]
if width != 300 or height != 110:
return (False,'图片尺寸:300/110'.format(imgscr))
x = random.randint(100, 260)
y = random.randint(0, 70)
w = x + 40
h = y + 40
coordinate = (x, y, w, h) region = image.crop(coordinate)
region = ImageEnhance.Contrast(region).enhance(1.0)
# region2 = ImageEnhance.Contrast(region).enhance(0.1)
region2 = ImageEnhance.Brightness(region).enhance(0.5)
buffered = BytesIO()
region.save(buffered, format="PNG")
img_paste = base64.b64encode(buffered.getvalue()).decode()
buffered.close() image.paste(region2, (x, y))
buffered2 = BytesIO()
image.save(buffered2, format="PNG")
img_bg = base64.b64encode(buffered2.getvalue()).decode()
buffered2.close() redis = redis_conn # 背景图片
redis.set("%s_%s_bg_img" % (prefix_str, uid), img_bg, 30)
# 可移动图片
redis.set("%s_%s_move_img" % (prefix_str, uid), img_paste, 30)
# 可移动图片x,y坐标
redis.set("%s_%s_move_xy" % (prefix_str, uid), '%s,%s' % (x, y), 30)
# 认证失败次数
redis.set("%s_%s_img_error_count" % (prefix_str, uid), 0, 30) data = {
'bg_img': img_bg,
'move_img': img_paste,
'move_y': y
}
return (True,data) #认证图片是否移动到指定位置
def AuthImage(redis_conn, uid,move_x,move_y):
isint_ret = isint(move_x, move_y)
if isint_ret[0] is False:
describe = 'The "%s" data type is int' % (isint_ret[1])
return (False,describe) # 获取x,y坐标
redis=redis_conn r_xy = redis.get("%s_%s_move_xy" % (prefix_str, uid))
if r_xy:
r_xy_list = r_xy.decode().split(',')
r_x = r_xy_list[0]
r_y = r_xy_list[1]
if abs(int(r_x) - int(move_x)) <= 1 and abs(int(r_y) - int(move_y)) <= 1:
redis.delete("%s_%s_bg_img" % (prefix_str, uid))
redis.delete("%s_%s_move_img" % (prefix_str, uid))
redis.delete("%s_%s_move_xy" % (prefix_str, uid))
redis.delete("%s_%s_img_error_count" % (prefix_str, uid))
random_str = str(uuid.uuid1()).replace('-', '')
redis.set("%s_%s_img_randm_str" % (prefix_str, uid), random_str, 30)
return (True,random_str)
else:
error_count = redis.get("%s_%s_img_error_count" % (prefix_str, uid))
if error_count:
error_count = int(error_count.decode())
new_count = error_count + 1
if new_count > 5:
describe = '%s 尝试次数过多' % (uid)
redis.delete("%s_%s_bg_img" % (prefix_str, uid))
redis.delete("%s_%s_move_img" % (prefix_str, uid))
redis.delete("%s_%s_move_xy" % (prefix_str, uid))
redis.delete("%s_%s_img_error_count" % (prefix_str, uid))
return (False,describe,True)
else:
redis.set("%s_%s_img_error_count" % (prefix_str, uid), new_count, 30)
describe = '%s 认证失败' % (uid)
return (False,describe)
else:
describe = '%s 认证失败' % (uid)
return (False,describe,True)
else:
describe = '%s 认证失败' % (uid)
return (False,describe,True)
python之滑动认证(图片)的更多相关文章
- 用 Python 和 OpenCV 检测图片上的条形码
用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问 ...
- H5+CSS3实现手指滑动切换图片
包含3个文件:html.slider-H5.js.jquery.js(自行下载).在html中可配置滑动参数.具体代码如下: HTML代码: <!DOCTYPE HTML> <htm ...
- ReactNative学习-滑动查看图片第三方组件react-native-swiper
滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方 ...
- Android:使用ViewPager实现左右滑动切换图片(图上有点点)
在以下实例的基础上加上点点 Android:使用ViewPager实现左右滑动切换图片 (简单版) 效果预览: 因为要把点点放图片上,所以修改布局为相对布局: <?xml version=&qu ...
- Android:使用ViewPager实现左右滑动切换图片 (简单版)
ViewPager,它是google SDk中自带的一个附加包的一个类, 可以使视图滑动. 步骤: 1.引入android-support-v4.jar包,在主布局里加入 <android.su ...
- Python实战:美女图片下载器,海量图片任你下载
Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...
- Python,PIL压缩裁剪图片
自己写了用来压缩 DC 照片的,批量处理整目录文件,非常方便.需要安装 PIL #!/usr/bin/env python import Image import os import os.path ...
- Python爬虫下载美女图片(不同网站不同方法)
声明:以下代码,Python版本3.6完美运行 一.思路介绍 不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法 1. 浏览器浏览分析地址变化规律 2. Python测试类获取网页内容,从 ...
- Python 3 实现色情图片识别
Python 3 实现色情图片识别 项目简介 项目内容 本实验将使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图片处理库,会编写算法来划分图像的皮肤区域. 项目知识点 Py ...
随机推荐
- Jmeter设置默认中文启动
安装好jmeter,启动的页面是全英文,对于不熟悉jmeter的人来说,理解起来还是很困难的.如何设置成中文页面呢? 方法一:打开jmeter后,设置Options—choose language—C ...
- 使用vue-video-player插件实现视频播放
来自于https://blog.csdn.net/abelethan/article/details/89016678博客 1下载插件==>npm install vue-video-playe ...
- C语言异常处理
异常的概念-程序在运行过程中可能产生异常-异常(Exception)与Bug的区别 异常是程序运行时可预料的执行分支 Bug是程序中的错误,是不被预期的运行方式 异常(Exception)和Bug的对 ...
- LeetCode 739 每日温度
1.直接遍历 暴力求解 class Solution { public: vector<int>dailyTemperatures(vector<int>& T) { ...
- 安装oracle 11g及初次链接使用, 解锁及常用命令
1. 安装方法参考原创: https://blog.csdn.net/projectNo/article/details/76533921 2.初次链接数据库时,注意以下: 1. window + r ...
- 深挖计算机基础:MySQL实战45讲学习笔记
参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...
- 全面理解UE4委托
UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系 监听者通过将响应函数绑定到委托上,使得委托触发时立即收到通知,并进行相 ...
- Idea Intellij 终生破解版
关于Idea Intellij 2018.3.2 破解问题,之前采用 jetbrains-agent.jar 破解,目前该插件已经失效,为了永久终生破解使用Idea,本篇文章提供JetbrainsI ...
- 详解Redis基本命令
当redis环境搭建结束后,接下来需要掌握并了解redis的一些相关命令,本篇文章主要从实际操作的层面来与大家分享redis基本命令, 具体包括:Redis五大基本类型命令(Strings,Lists ...
- k8s二进制部署
k8s二进制部署 1.环境准备 主机名 ip地址 角色 k8s-master01 10.0.0.10 master k8s-master02 10.0.0.11 master k8s-node01 1 ...