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. debian 10 安装fcitx 后设置

    设置好代理后 apt-get install fcitx 后 仍然看不到 语言栏 可能是 在设置fcitx时 的字体太小了 输入法配置 ->外观->字体 加大 即可

  2. C++ 基础语法 快速复习笔记---面对对象编程(2)

    1.C++面对对象编程: a.定义: 类定义是以关键字 class 开头,后跟类的名称.类的主体是包含在一对花括号中.类定义后必须跟着一个分号或一个声明列表. 关键字 public 确定了类成员的访问 ...

  3. vue--实现跑马灯效果

    <div id="app"> <input type="button" value="开始" @click="l ...

  4. Python3面向对象编程实例

    /*认真研究完这个实例,理解python面向对象编程的方法*/class Person: """人员信息""" # 姓名(共有属性) nam ...

  5. 201871010111-刘佳华《面向对象程序设计(java)》第七周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第七周学习总结 实验时间 2019-10-11 1.实验目的与要求 1) 掌握四种访问权限修饰符的使用特点: (1)进一步理 ...

  6. day67_10_11

    一.路由跳转 在vue中,路由条状有很多种. 其中有点击事件触发的路由跳转: this.$router.push('/course'); 和通过名字跳转的: this.$router.push({na ...

  7. opencv 截取任意四边形区域的图像

    截取任意四边形区域的图像. mask就是结果. 需要定义四边形区域,分别是 tl, tr, bl, br std::map<int, std::set<int>> genera ...

  8. 编程计算2×3阶矩阵A和3×2阶矩阵B之积C。 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值。 要求: (1)从键盘分别输入矩阵A和B, 输出乘积矩阵C (2) **输入提示信息为: 输入矩阵A之前提示:"Input 2*3 matrix a:\n" 输入矩阵B之前提示

    编程计算2×3阶矩阵A和3×2阶矩阵B之积C. 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值. 要求: ...

  9. vue组件通信传值——Vuex

    一.Vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex 也集成到 Vu ...

  10. 【转】UML各种图总结

    UML(Unified Modeling Language)是一种统一建模语言,为面向对象开发系统的产品进行说明.可视化.和编制文档的一种标准语言.下面将对UML的九种图+包图的基本概念进行介绍以及各 ...