用python对图片批量压缩和格式转换

python作为简单、易学的编程语言,上手入门要容易许多。如果数据分析、机器学习、人工智能这些对你来说比较遥远,用python写一点实用的小脚本帮你解决问题、提高办公效率也是不错的。

图片缩放、格式转换是一个常见的需求,网上虽然有许多这样的工具,但是下载站的质量参差不齐,如果没注意的话非常容易中招。这样不如自己用python写一个,安全有保障。

主要用到了PIL对图像进行处理。tkinter用来做图形界面,方便打包分享使用。

实现效果

实现代码

1import os 2from PIL import Image 3import tkinter 4import tkinter.filedialog 5import tkinter.messagebox 6 7 8class Window(): 9    def __init__(self): 10        self.root = root = tkinter.Tk() 11        self.menu = tkinter.Menu(root) 12        self.submenu = tkinter.Menu(self.menu, tearoff=0) 13        root.config(menu=self.submenu) 14        self.Image = tkinter.StringVar() 15        self.Image.set('.bmp') 16        self.mstatus = tkinter.IntVar() 17        self.fstatus = tkinter.IntVar() 18        self.mstatus.set(0) 19        self.fstatus.set(0) 20        self.status = tkinter.StringVar() 21        self.label = tkinter.Label(root, text='输入百分比') 22        self.label.place(x=5, y=5) 23        self.entryNew = tkinter.Entry(root) 24        self.entryNew.place(x=70, y=5) 25        self.checkM = tkinter.Checkbutton(self.root, text='批量转换', command=self.OnCheckM, variable=self.mstatus, 26                                          onvalue=1, offvalue=0) 27        self.checkM.place(x=5, y=30) 28        self.label = tkinter.Label(root, text='选择文件') 29        self.label.place(x=5, y=55) 30        self.entryFile = tkinter.Entry(root) 31        self.entryFile.place(x=70, y=55) 32        self.BrowserFileButton = tkinter.Button(root, text='浏览', command=self.BrowserFile) 33        self.BrowserFileButton.place(x=220, y=55) 34        self.label = tkinter.Label(root, text='选择目录') 35        self.label.place(x=5, y=90) 36        self.entryDir = tkinter.Entry(root, state=tkinter.DISABLED) 37        self.entryDir.place(x=70, y=90) 38        self.BrowserDirButton = tkinter.Button(root, text='浏览', command=self.BrowserDir, state=tkinter.DISABLED) 39        self.BrowserDirButton.place(x=220, y=90) 40 41        self.checkF = tkinter.Checkbutton(root, text='改变文件格式', onvalue=1, offvalue=0, variable=self.fstatus, 42                                          command=self.OnCheckF) 43        self.checkF.place(x=5, y=120) 44 45        frame = tkinter.Frame(root, ) 46        frame.place(x=10, y=150) 47        self.rBmp = tkinter.Radiobutton(frame, variable=self.Image, value='.bmp', text='BMP', state=tkinter.DISABLED) 48        self.rBmp.pack(anchor='w') 49        self.rJpg = tkinter.Radiobutton(frame, variable=self.Image, value='.jpg', text='JPG', state=tkinter.DISABLED) 50        self.rJpg.pack(anchor='w') 51        self.rPng = tkinter.Radiobutton(frame, variable=self.Image, value='.png', text='PNG', state=tkinter.DISABLED) 52        self.rPng.pack(anchor='w') 53        self.rGif = tkinter.Radiobutton(frame, variable=self.Image, value='.gif', text='GIF', state=tkinter.DISABLED) 54        self.rGif.pack(anchor='w') 55        self.ButtonCov = tkinter.Button(root, text='转换格式', command=self.Conv, ) 56        self.ButtonCov.place(x=120, y=180) 57        self.statusLabel = tkinter.Label(root, textvariable=self.status, fg='red') 58        self.statusLabel.place(x=80, y=220) 59 60    def OnCheckM(self): 61        if not self.mstatus.get(): 62            self.entryDir.config(state=tkinter.DISABLED) 63            self.entryFile.config(state=tkinter.NORMAL) 64            self.BrowserFileButton.config(state=tkinter.NORMAL) 65            self.BrowserDirButton.config(state=tkinter.DISABLED) 66        else: 67            self.entryDir.config(state=tkinter.NORMAL) 68            self.entryFile.config(state=tkinter.DISABLED) 69            self.BrowserFileButton.config(state=tkinter.DISABLED) 70            self.BrowserDirButton.config(state=tkinter.NORMAL) 71 72    def OnCheckF(self): 73        if not self.fstatus.get(): 74            self.rBmp.config(state=tkinter.DISABLED) 75            self.rPng.config(state=tkinter.DISABLED) 76            self.rJpg.config(state=tkinter.DISABLED) 77            self.rGif.config(state=tkinter.DISABLED) 78        else: 79            self.rBmp.config(state=tkinter.NORMAL) 80            self.rPng.config(state=tkinter.NORMAL) 81            self.rJpg.config(state=tkinter.NORMAL) 82            self.rGif.config(state=tkinter.NORMAL) 83 84    def BrowserFile(self): 85        file = tkinter.filedialog.askopenfilename(title='Python player', 86                                                  filetypes=[('JPG', '*.jpg'), ('BMP', '*.bmp'), ('GIF', '*.gif'), 87                                                             ('PNG', '*.png')]) 88        if file: 89            self.entryFile.delete(0, tkinter.END) 90            self.entryFile.insert(tkinter.END, file) 91 92    def BrowserDir(self): 93        directory = tkinter.filedialog.askdirectory(title='Python') 94        if directory: 95            self.entryDir.delete(0, tkinter.END) 96            self.entryDir.insert(tkinter.END, directory) 97 98    def make(self, file, format=None): 99        im = Image.open(file) 100        mode = im.mode 101        if mode not in ('L', 'RGB'): 102            im = im.convert('RGB') 103        width, height = im.size 104        s = self.entryNew.get() 105        if s == '': 106            tkinter.messagebox.showerror('出错啦', '请输入百分比') 107            return 108        else: 109            n = int(s) 110        nwidth = int(width * n / 100) 111        nheight = int(height * n / 100) 112        thumb = im.resize((nwidth, nheight), Image.ANTIALIAS) 113        if format: 114            thumb.save(file[:(len(file) - 4)] + '_thumb' + format) 115        else: 116            thumb.save(file[:(len(file) - 4)] + '_thumb' + file[-4:]) 117 118    def Conv(self): 119        n = 0 120        if self.mstatus.get(): 121            path = self.entryDir.get() 122            if path == "": 123                tkinter.messagebox.showerror('出错啦', '请选择路径') 124                return 125            filenames = os.listdir(path) 126            if self.fstatus.get(): 127                f = self.Image.get() 128                print(f) 129                for filename in filenames: 130                    if filename[-3:] in ('bmp', 'jpg', 'gif', 'png'): 131                        self.make(path + '/' + filename, f) 132                        n += 1 133            else: 134                for filename in filenames: 135                    if filename[-3:] in ('bmp', 'jpg', 'gif', 'png'): 136                        self.make(path + '/' + filename) 137                        n += 1 138        else: 139            file = self.entryFile.get() 140            if file == '': 141                tkinter.messagebox.showerror('出错啦', '请选择文件') 142                return 143            if self.fstatus.get(): 144                f = self.Image.get() 145                self.make(file, f) 146                n += 1 147            else: 148                self.make(file) 149                n += 1 150        self.status.set('成功转换 %d 张图片' % n) 151 152    def mainloop(self): 153        self.root.minsize(280, 270) 154        self.root.maxsize(280, 250) 155        self.root.title('图片转换') 156        self.root.mainloop() 157 158 159if __name__ == "__main__": 160    window = Window() 161    window.mainloop() 162

本文转转自微信公众号快学Python原创https://mp.weixin.qq.com/s/XJUqSXDmzLO5Pc7jJt4Edw,可扫描二维码进行关注: 如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

​一篇文章总结一下Python库中关于时间的常见操作

前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在