利用Python实现自动批量图片格式转换

利用Python实现自动批量图片格式转换

0.背景

在一个漫画网站下载了一些图片,但下载下来之后发现是webp格式,不能直接查看,于是决定将这些图片全部转为JPG等便于查看的格式,但是无论是网上的一些在线转换网站还是一些软件,要么不好使,要么要钱。于是决定利用Python写一个脚本,来实现这一功能。

1.简单思路

经过查询资料,我们得知主要需要用PIL这个对图片进行操作,即打开并识别webp格式的图片,并保存为JPG格式即可。
那么我们即可获得最初版本的代码:

from PIL import Image
for i in range(1,25):
    if (i<10):
        filename = f'0{i}.webp'
    else:
        filename = f'{i}.webp'
    im = Image.open(filename)
    if im.mode == "RGBA":
            im.load()  # required for png.split()
            background = Image.new("RGB", im.size, (255, 255, 255))
            background.paste(im, mask=im.split()[3]) 
    save_name = filename.replace('webp', 'jpg')
    im.save('{}'.format(save_name), 'JPEG')

其中自动打开文件依赖于文件名称十分规则,而面对名称比较奇怪的就需要做进一步的修正,具体如下:

from PIL import Image
import re
for i in range(24,52):
    if (i<10):
        filename = f'0{i}_0{i-1}.webp'
    elif (i==10):
        filename = f'10_09.webp'
    else:
        filename = f'{i}_{i-1}.webp'
    im = Image.open(filename)
    if im.mode == "RGBA":
            im.load()  # required for png.split()
            background = Image.new("RGB", im.size, (255, 255, 255))
            background.paste(im, mask=im.split()[3]) 
    save_name = filename.replace('webp', 'jpg')
    im.save('{}'.format(save_name), 'JPEG')

2.进一步改进

然后在后续的一些图片集中,出现了一些实在没有规律的名称,这是我突然意识到,我直接找所有文件的文件名,然后把不是图片的不管,是webp格式的转为JPG就好了。。。
于是就有了下面这个进阶版的脚本,可以无视图片名称,完成格式转换。

from PIL import Image
import os
files = os.listdir()
for file in files :
    filename = file
    if(file=='.DS_Store'):
        continue
    if(file=='Untitled的副本 3.py'):
        continue
    im = Image.open(filename)
    if im.mode == "RGBA":
            im.load()  # required for png.split()
            background = Image.new("RGB", im.size, (255, 255, 255))
            background.paste(im, mask=im.split()[3]) 
    save_name = filename.replace('webp', 'png')
    im.save('{}'.format(save_name), 'png')

这一阶段遇到的bug:
1.部分图片无法保存为.jpg格式,一顿操作之后也没整好,最后保存为.png格式反而就没事了。
2.苹果系统自带.DS_Store文件,需要把这个排除掉。

3.最终版本

在上一个版本用了很久之后,我又遇到了一个新问题,那就是当图片集太多时一个一个处理仍需要很多时间。于是我思考,有没有什么好的方法,可以实现一键处理包含许多图片集文件夹的方法。
经过我缜密的思考,以及查询,最后获得了这个最终版本,我还顺便做了图片格式转换完成后删除原webp格式的图片
具体如下:

from PIL import Image
import os
files = os.listdir()
for file in files :
    if(file=='.DS_Store'):
            continue
    if(file=='Untitled的副本3.py'):
            continue
    now = os.path.dirname(os.path.abspath(__file__))
    File = os.listdir(f'{now}/{file}')
    #print(File)
    for real_file in File:
        filename = real_file
        if(real_file=='.DS_Store'):
            continue
        if(real_file=='Untitled的副本3.py'):
            continue
        #print(filename)
        
        im = Image.open(f'{now}/{file}/{filename}')
        if im.mode == "RGBA":
                im.load()  # required for png.split()
                background = Image.new("RGB", im.size, (255, 255, 255))
                background.paste(im, mask=im.split()[3]) 
        save_name = filename.replace('webp', 'png')
        #im.save('{}'.format(save_name), 'png')
        im.save(f'{now}/{file}/{save_name}', 'png')
        os.remove(f'{now}/{file}/{filename}')

这一阶段甚至没遇到什么bug,核心就是把变量名和地址搞清楚。打开路径,保存路径和删除路径不能搞错。

4.总结

首先是Python yyds!
这个自动化功能的实现主要是依赖于Python的os库和PIL库,他们的功能分别是处理系统文件和处理图片。在写这个之前AFK了Python好久,在不断改进的过程中也顺便复习了下Python的语法。记录一下,希望对自己未来和读者有所帮助。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值