巧合之下,需要一个能够批处理压缩图片的程序来帮我的私人图库做一个压缩。在网上找了一些软件,但是都没有遇到合适的(或者免费的bushi),于是想到能不能用自己拙劣的python写个小程序呢?
于是在网上搜寻处理图片的库,然后找他们的compress,可是结果是一大堆的resize,要是有哪位好心人可以给我介绍下两者的区别或者compress的合适的库,不胜感激啊(~ ̄▽ ̄)~
所以没错,下面的就是用pillow的resize里滤波采样的那个参数弄的伪压缩,opencv和numpy里也是有这个参数的,因为这个比较顺手,就用了这个,所以诶~别跑啊~大人!!
那下面就开始咯
import os from PIL import Image
首先引用两个库,os是读取文件目录用的,pillow就是主角啦,处理图片,然后捏就是这样啦
def compress_pic(src_file,save_file,choice): fileName = os.listdir(src_file) print(fileName) # # 如果目录不存在,则创建目录 # if not os.path.exists('D:/PycharmProjects/pythonProject4/images/'): # os.mkdir('D:/PycharmProjects/pythonProject4/images/') #目录记得是/的,复制过来的要改下 # # 循环读取每一张图片 for img in fileName: old_pic = Image.open(src_file + '/' + img) print(old_pic.size) if choice == '方式一': new_image = old_pic.resize(old_pic.size, Image.BICUBIC)#两种采样方式二选一,下面的会更加高质量,内存稍大 else: new_image = old_pic.resize(old_pic.size,Image.ANTIALIAS)#第一个参数是元组(宽,高),也可以用获得size的方式来获取等比例缩小或者原图 print (new_image) # os.mkdir('D:/PycharmProjects/pythonProject4/Newimage01/') new_image.save(save_file + '/' + img) # new_image.save('D:/PycharmProjects/pythonProject4/newhigh/'+img)d定义
定义一个函数compress_pic,至于为什么要用函数,其实 类也可以,但这里程序比较少内容,所以就直接用了,另外,待会还得做个小GUI来方便其他人用这个程序
三个参数 src_file,save_file,choice 分别为 要处理的图库所在的文件夹,压缩后要保存的文件夹所在位置(要提前建立,当然程序里也可以改成如果没有就帮建),压缩方式的选择(一二都可以,区别没感觉)另外想说的是, 这里是可以资源管理器直接打开然后复制到我们的窗口里面的,路径里的“/”“\”会在程序里处理。
然后是我们的GUI程序,我选择了最简单的pysimplegui,人如其名好吧。
import main import PySimpleGUI as sg sg.theme('BluePurple') # 定义窗口的布局 layout = [ [sg.Text('输入你需要修改的照片的文件夹位置,复制粘贴下来即可,如D:\image'),sg.InputText()], [sg.Text('输入你需要修改的照片的保存的文件夹位置(需要提前新建哦)'), sg.InputText()], [sg.Text('输入你要的压缩方式,如‘方式一’或者‘方式二’,不要输入引号,前者压缩质量高,后者差点'), sg.InputText()], # sg.Combo( # ['选项一,高质量', '选项二,较差'], # default_value='选项一', # size=(10, 1)), #TODO 用不了combo 解释器没有全局设置,未解决 [sg.Button('Ok'), sg.Button('Cancel')] ] # 创建展示窗口 window = sg.Window('图像批处理', layout) # 事件循环并获取输入值 while True: event, values = window.read() if event in (None, 'Cancel'): break # print('You entered ', type(values[0].replace('\\','/'))) #修改路径用的 # print('You entered ', values[0].replace('\\','/')) #修改路径用的 src_file = values[0].replace('\\','/') save_file = values[1].replace('\\','/') # sg.popup('You entered', values[0].replace('\\','/')) # #todo 弹出窗口确认未设置 choice = values[2] main.compress_pic(src_file,save_file,choice) window.close()
基本就这样,不难读懂,然后还有几个TODO未解决,搞定的小伙伴一定要让我康康哦( ͡• ͜ʖ ͡• )
然后,接下来就是封装成exe文件,让你那没有朋友的技术,哦不是,没有技术的朋友,没有环境的电脑也能使用这个程序,在 pycharm的terminal输入下面的命令行
pyinstaller -F -w windows.py -n compress -p main.py
然后就生成一个exe啦,可以发给你的小伙伴了,另外可能要管理员权限,或者文件夹用D盘的
效果如下
两个程序补在下面
main.py import os from PIL import Image def compress_pic(src_file,save_file,choice): fileName = os.listdir(src_file) print(fileName) # 如果目录不存在,则创建目录 if not os.path.exists('D:/PycharmProjects/pythonProject4/images/'): os.mkdir('D:/PycharmProjects/pythonProject4/images/') #目录记得是/的,复制过来的要改下 # 循环读取每一张图片 for img in fileName: old_pic = Image.open(src_file + '/' + img) print(old_pic.size) if choice == '方式一': new_image = old_pic.resize(old_pic.size, Image.BICUBIC)#两种采样方式二选一,下面的会更加高质量,内存稍大 else: new_image = old_pic.resize(old_pic.size,Image.ANTIALIAS)#第一个参数是元组(宽,高),也可以用获得size的方式来获取等比例缩小或者原图 print (new_image) new_image.save(save_file + '/' + img)
import main import PySimpleGUI as sg sg.theme('BluePurple') # 定义窗口的布局 layout = [ [sg.Text('输入你需要修改的照片的文件夹位置,复制粘贴下来即可,如D:\image'),sg.InputText()], [sg.Text('输入你需要修改的照片的保存的文件夹位置(需要提前新建哦)'), sg.InputText()], [sg.Text('输入你要的压缩方式,如‘方式一’或者‘方式二’,不要输入引号,前者压缩质量高,后者差点'), sg.InputText()], # sg.Combo( # ['选项一,高质量', '选项二,较差'], # default_value='选项一', # size=(10, 1)), #TODO 用不了combo 解释器没有全局设置,未解决 [sg.Button('Ok'), sg.Button('Cancel')] ] # 创建展示窗口 window = sg.Window('图像批处理', layout) # 事件循环并获取输入值 while True: event, values = window.read() if event in (None, 'Cancel'): break src_file = values[0].replace('\\','/') save_file = values[1].replace('\\','/') choice = values[2] main.compress_pic(src_file,save_file,choice) window.close()