批量修改图片大小(带waifu2x)

这两天教nemo弄博客的时候,又用到了之前写的两个抓取并处理色图博客背景图的python脚本。这时候nemo提议我把处理图片的脚本做成exe,可以方便修改图片,于是就花了一天弄了下

首先掏出我们的主业务逻辑:

#caiji
def cut_pic(self, width, height):
    proportion = float(self.size[0])/self.size[1]    #宽:高
    if width > height*proportion:
        width = int(height*proportion)
    else:
        height = int(width/proportion)
    return (width,height)

def run(self):
    file = os.listdir(self.dir_in)
    for index,pic in enumerate(file):
        img = Image.open(self.dir_in+'/'+pic)
        img = img.convert("RGB")

        width = img.size[0]
        height = img.size[1]
        after_width, after_height = self.cut_pic(width, height)
        #裁剪图片
        img = img.crop(
            (
                width/2 - after_width/2,
                height/2 - after_height/2,
                width/2 + after_width/2,
                height/2 + after_height/2,
            )
        )
        #缩放图片
        img = img.resize(tuple(self.size))
        img.save(self.dir_out+'/'+str(index+1)+'.jpg')

这样就可以做到批量不变形缩放图片了,但是问题来了:要是放大图片的话图片会变模糊。这时候就要祭出神器:waifu2x

def waifu2x(self, pic_path):
    r = requests.post("https://api.deepai.org/api/waifu2x",
        files={
            'image': open(pic_path, 'rb'),
        },
        headers={'api-key': ''}  #在https://deepai.org/machine-learning-model/waifu2x创建账号就有key了
    )
    pic_response = requests.get(url=r.json()['output_url'])
    return pic_response.content

由于读到的图片是bytes格式的数据,怎么用pillow库读取呢?

img = Image.open(BytesIO(self.waifu2x(self.dir_in+'/'+pic)))

这些都解决了之后,碰到了一个最大的问题:这个requests很慢(一张图一分钟的样子),慢到windows都以为我们这程序挂了,会弹出程序未响应

解决方法:将业务逻辑写在新的线程里,这篇文章写的很好,可以参考

初版下载地址(api key内置了,不用填)

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注