• 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)
    
  • 相关阅读:
    php命令注入
    mysql事物
    安装php环境
    移除服务器缓存实例
    show user profile synchronization tools
    manual start user profile import
    JSON is undefined. Infopath Form People Picker in SharePoint 2013
    asp.net web 应用站点支持域账户登录
    Load sharepoint envirement by powershell
    sharepoint 2016 download
  • 原文地址:https://www.cnblogs.com/zhangkui/p/11322699.html
Copyright © 2020-2023  润新知