验证码混乱还原

说明!文章仅供学习交流,如若出现侵权等行为请联系我,立即删除!!!

人工还原

乱序验证码如F图为例
在这里插入图片描述

还愿的图片如下图为例
在这里插入图片描述

①判断当前验证图片分了几个部分
观察图片,好像分成了13份,但当对13份进行拼接时发现不能够还原图片,细瞅,每一份好像从中心细开始进行了水平翻转,上下翻转
②尝试将分开的部分进行重新拼接
③使用代码进行尝试

前情知识

使用py中的Image库
  1. 裁剪方法
    cropped_img = img.crop((left, top, right, bottom))
    left为需要裁剪的左边界,right为需要裁剪的右边界,top为上边界,bottom为裁剪的下边界
  2. 拼接方法
    merge_img = new_image.paste(image, (left, top, right, bottom))
    第一个参数为需要进行拼接的图片,第二参数为拼接到参数的位置

代码实测

#分割图片
def cropped_image(imgPath):
    image1 = Image.open(imgPath)
    filename = imgPath.split('.')[0]
    print(filename)
    path = f'{filename}'
    print(path)
    
    if not os.path.exists(path):
        os.makedirs(path)
    # 获取图片尺寸
    width, height = image1.size
    print(width,height)
    for i in range(1,int(width/26+1)+1):
        new_image = Image.new('RGB', (24, 160))
        # 裁剪图片
        leftx = 24*(i-1)
        rightx = leftx + 24
        print(leftx,rightx)
        cropped_image = image1.crop((leftx, 0, rightx, 160))
        # 保存裁剪后的图片
        cropped_image.save(f'{path}/{i}.png')
    return path


#按照正确顺序重排图片
def merge(filePath):
    newImagename = 'merged_image_new.jpg'
    ls = [7,12,8,11,5,13,4,2,1,6,3,10,9]
    new_image = Image.new('RGB', (312, 160))
    for a in range(len(ls)):
        image = Image.open(f'{filePath}/{str(ls[a])}.png')
        leftx = 24 * a
        new_image.paste(image, (leftx, 0))
    new_image.save(f'{filePath}/{newImagename}')
    return newImagename


#实现左右反转
def swap(filePath,filename):
    new_image = Image.new('RGB', (312, 160))
    image1 = Image.open(f'{filePath}/{filename}')
    for i in range(0,13):   
        x = 12*(i*2+1)
        print(x)
        if (i %2 != 0):   
            l_image_x = image1.crop((x-12, 80, x, 160))
            r_image_x = image1.crop((x, 80, x+12, 160))
            new_image.paste(r_image_x, (x, 0, x+12 , 80))
            new_image.paste(l_image_x, (x-12, 0, x, 80))
       
            l_image_s = image1.crop((x-12, 0, x, 80))
            r_image_s = image1.crop((x, 0, x+12, 80))
            new_image.paste(r_image_s, (x-12, 80, x, 160))
            new_image.paste(l_image_s, (x, 80, x+12 , 160))
        else:
            
            l_image_x = image1.crop((x-12, 80, x, 160))
            r_image_x = image1.crop((x, 80, x+12, 160))
            new_image.paste(r_image_x, (x-12, 0, x, 80))
            new_image.paste(l_image_x, (x, 0, x+12 , 80))

            l_image_s = image1.crop((x-12, 0, x, 80))
            r_image_s = image1.crop((x, 0, x+12, 80))
            new_image.paste(r_image_s, (x, 80, x+12 , 160))
            new_image.paste(l_image_s, (x-12, 80, x, 160))
        new_image.save(f'{filePath}/bg.png')


def merge_slide(filePath):
    slide = Image.open("slide.png")
    bg = Image.open(f'{filePath}/bg.png')

    # 拼接图片
    bg.paste(slide, (0, 40))

    # 保存拼接后的图片
    bg.save(f'{filePath}/newbg.jpg')

在代码测试的时候发现,每部分的转换会从中心线分割之后,将顺序为单数进行水平翻转,否则不翻转!!!

最后!!,代码不够通用性,以后遇到会进行进一步修改。增强代码的通用性,有什么问题可以评论。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值