zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    实验-继承&super.doc
    Python库
    Github高级搜索
    代码报错记录
    编程问题解决
    百科
    【Android】添加依赖包
    【Android】导航栏(加图片icon)和不同页面的实现(viewpager+tablayout)
    【Android】Android Studio真机调试的问题统整
    【AD】自己画板的备忘
  • 原文地址:https://www.cnblogs.com/zhangkui/p/11322699.html
Copyright © 2011-2022 走看看