文章目录
利用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的语法。记录一下,希望对自己未来和读者有所帮助。