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之滑动认证(图片)的更多相关文章

  1. 用 Python 和 OpenCV 检测图片上的条形码

      用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问 ...

  2. H5+CSS3实现手指滑动切换图片

    包含3个文件:html.slider-H5.js.jquery.js(自行下载).在html中可配置滑动参数.具体代码如下: HTML代码: <!DOCTYPE HTML> <htm ...

  3. ReactNative学习-滑动查看图片第三方组件react-native-swiper

    滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方 ...

  4. Android:使用ViewPager实现左右滑动切换图片(图上有点点)

    在以下实例的基础上加上点点 Android:使用ViewPager实现左右滑动切换图片 (简单版) 效果预览: 因为要把点点放图片上,所以修改布局为相对布局: <?xml version=&qu ...

  5. Android:使用ViewPager实现左右滑动切换图片 (简单版)

    ViewPager,它是google SDk中自带的一个附加包的一个类, 可以使视图滑动. 步骤: 1.引入android-support-v4.jar包,在主布局里加入 <android.su ...

  6. Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  7. Python,PIL压缩裁剪图片

    自己写了用来压缩 DC 照片的,批量处理整目录文件,非常方便.需要安装 PIL #!/usr/bin/env python import Image import os import os.path ...

  8. Python爬虫下载美女图片(不同网站不同方法)

    声明:以下代码,Python版本3.6完美运行 一.思路介绍 不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法 1. 浏览器浏览分析地址变化规律 2. Python测试类获取网页内容,从 ...

  9. Python 3 实现色情图片识别

    Python 3 实现色情图片识别 项目简介 项目内容 本实验将使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图片处理库,会编写算法来划分图像的皮肤区域. 项目知识点 Py ...

随机推荐

  1. Jmeter设置默认中文启动

    安装好jmeter,启动的页面是全英文,对于不熟悉jmeter的人来说,理解起来还是很困难的.如何设置成中文页面呢? 方法一:打开jmeter后,设置Options—choose language—C ...

  2. 使用vue-video-player插件实现视频播放

    来自于https://blog.csdn.net/abelethan/article/details/89016678博客 1下载插件==>npm install vue-video-playe ...

  3. C语言异常处理

    异常的概念-程序在运行过程中可能产生异常-异常(Exception)与Bug的区别 异常是程序运行时可预料的执行分支 Bug是程序中的错误,是不被预期的运行方式 异常(Exception)和Bug的对 ...

  4. LeetCode 739 每日温度

    1.直接遍历 暴力求解 class Solution { public: vector<int>dailyTemperatures(vector<int>& T) { ...

  5. 安装oracle 11g及初次链接使用, 解锁及常用命令

    1. 安装方法参考原创: https://blog.csdn.net/projectNo/article/details/76533921 2.初次链接数据库时,注意以下: 1. window + r ...

  6. 深挖计算机基础:MySQL实战45讲学习笔记

    参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...

  7. 全面理解UE4委托

    UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系 监听者通过将响应函数绑定到委托上,使得委托触发时立即收到通知,并进行相 ...

  8. Idea Intellij 终生破解版

    关于Idea Intellij 2018.3.2 破解问题,之前采用 jetbrains-agent.jar  破解,目前该插件已经失效,为了永久终生破解使用Idea,本篇文章提供JetbrainsI ...

  9. 详解Redis基本命令

    当redis环境搭建结束后,接下来需要掌握并了解redis的一些相关命令,本篇文章主要从实际操作的层面来与大家分享redis基本命令, 具体包括:Redis五大基本类型命令(Strings,Lists ...

  10. k8s二进制部署

    k8s二进制部署 1.环境准备 主机名 ip地址 角色 k8s-master01 10.0.0.10 master k8s-master02 10.0.0.11 master k8s-node01 1 ...