用python對(duì)圖片批量壓縮和格式轉(zhuǎn)換

留言有禮,每天都會(huì)從留言中選出三位抽取6.6元紅包
python作為簡(jiǎn)單、易學(xué)的編程語(yǔ)言,上手入門要容易許多。如果數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、人工智能這些對(duì)你來(lái)說(shuō)比較遙遠(yuǎn),用python寫一點(diǎn)實(shí)用的小腳本幫你解決問(wèn)題、提高辦公效率也是不錯(cuò)的。
圖片縮放、格式轉(zhuǎn)換是一個(gè)常見的需求,網(wǎng)上雖然有許多這樣的工具,但是下載站的質(zhì)量參差不齊,如果沒注意的話非常容易中招。這樣不如自己用python寫一個(gè),安全有保障。
主要用到了PIL對(duì)圖像進(jìn)行處理。tkinter用來(lái)做圖形界面,方便打包分享使用。
實(shí)現(xiàn)效果


實(shí)現(xiàn)代碼
import?os
from?PIL import?Image
import?tkinter
import?tkinter.filedialog
import?tkinter.messagebox
class?Window():
????def?__init__(self):
????????self.root = root = tkinter.Tk()
????????self.menu = tkinter.Menu(root)
????????self.submenu = tkinter.Menu(self.menu, tearoff=0)
????????root.config(menu=self.submenu)
????????self.Image = tkinter.StringVar()
????????self.Image.set('.bmp')
????????self.mstatus = tkinter.IntVar()
????????self.fstatus = tkinter.IntVar()
????????self.mstatus.set(0)
????????self.fstatus.set(0)
????????self.status = tkinter.StringVar()
????????self.label = tkinter.Label(root, text='輸入百分比')
????????self.label.place(x=5, y=5)
????????self.entryNew = tkinter.Entry(root)
????????self.entryNew.place(x=70, y=5)
????????self.checkM = tkinter.Checkbutton(self.root, text='批量轉(zhuǎn)換', command=self.OnCheckM, variable=self.mstatus,
??????????????????????????????????????????onvalue=1, offvalue=0)
????????self.checkM.place(x=5, y=30)
????????self.label = tkinter.Label(root, text='選擇文件')
????????self.label.place(x=5, y=55)
????????self.entryFile = tkinter.Entry(root)
????????self.entryFile.place(x=70, y=55)
????????self.BrowserFileButton = tkinter.Button(root, text='瀏覽', command=self.BrowserFile)
????????self.BrowserFileButton.place(x=220, y=55)
????????self.label = tkinter.Label(root, text='選擇目錄')
????????self.label.place(x=5, y=90)
????????self.entryDir = tkinter.Entry(root, state=tkinter.DISABLED)
????????self.entryDir.place(x=70, y=90)
????????self.BrowserDirButton = tkinter.Button(root, text='瀏覽', command=self.BrowserDir, state=tkinter.DISABLED)
????????self.BrowserDirButton.place(x=220, y=90)
????????self.checkF = tkinter.Checkbutton(root, text='改變文件格式', onvalue=1, offvalue=0, variable=self.fstatus,
??????????????????????????????????????????command=self.OnCheckF)
????????self.checkF.place(x=5, y=120)
????????frame = tkinter.Frame(root, )
????????frame.place(x=10, y=150)
????????self.rBmp = tkinter.Radiobutton(frame, variable=self.Image, value='.bmp', text='BMP', state=tkinter.DISABLED)
????????self.rBmp.pack(anchor='w')
????????self.rJpg = tkinter.Radiobutton(frame, variable=self.Image, value='.jpg', text='JPG', state=tkinter.DISABLED)
????????self.rJpg.pack(anchor='w')
????????self.rPng = tkinter.Radiobutton(frame, variable=self.Image, value='.png', text='PNG', state=tkinter.DISABLED)
????????self.rPng.pack(anchor='w')
????????self.rGif = tkinter.Radiobutton(frame, variable=self.Image, value='.gif', text='GIF', state=tkinter.DISABLED)
????????self.rGif.pack(anchor='w')
????????self.ButtonCov = tkinter.Button(root, text='轉(zhuǎn)換格式', command=self.Conv, )
????????self.ButtonCov.place(x=120, y=180)
????????self.statusLabel = tkinter.Label(root, textvariable=self.status, fg='red')
????????self.statusLabel.place(x=80, y=220)
????def?OnCheckM(self):
????????if?not?self.mstatus.get():
????????????self.entryDir.config(state=tkinter.DISABLED)
????????????self.entryFile.config(state=tkinter.NORMAL)
????????????self.BrowserFileButton.config(state=tkinter.NORMAL)
????????????self.BrowserDirButton.config(state=tkinter.DISABLED)
????????else:
????????????self.entryDir.config(state=tkinter.NORMAL)
????????????self.entryFile.config(state=tkinter.DISABLED)
????????????self.BrowserFileButton.config(state=tkinter.DISABLED)
????????????self.BrowserDirButton.config(state=tkinter.NORMAL)
????def?OnCheckF(self):
????????if?not?self.fstatus.get():
????????????self.rBmp.config(state=tkinter.DISABLED)
????????????self.rPng.config(state=tkinter.DISABLED)
????????????self.rJpg.config(state=tkinter.DISABLED)
????????????self.rGif.config(state=tkinter.DISABLED)
????????else:
????????????self.rBmp.config(state=tkinter.NORMAL)
????????????self.rPng.config(state=tkinter.NORMAL)
????????????self.rJpg.config(state=tkinter.NORMAL)
????????????self.rGif.config(state=tkinter.NORMAL)
????def?BrowserFile(self):
????????file = tkinter.filedialog.askopenfilename(title='Python player',
??????????????????????????????????????????????????filetypes=[('JPG', '*.jpg'), ('BMP', '*.bmp'), ('GIF', '*.gif'),
?????????????????????????????????????????????????????????????('PNG', '*.png')])
????????if?file:
????????????self.entryFile.delete(0, tkinter.END)
????????????self.entryFile.insert(tkinter.END, file)
????def?BrowserDir(self):
????????directory = tkinter.filedialog.askdirectory(title='Python')
????????if?directory:
????????????self.entryDir.delete(0, tkinter.END)
????????????self.entryDir.insert(tkinter.END, directory)
????def?make(self, file, format=None):
????????im = Image.open(file)
????????mode = im.mode
????????if?mode not?in?('L', 'RGB'):
????????????im = im.convert('RGB')
????????width, height = im.size
????????s = self.entryNew.get()
????????if?s == '':
????????????tkinter.messagebox.showerror('出錯(cuò)啦', '請(qǐng)輸入百分比')
????????????return
????????else:
????????????n = int(s)
????????nwidth = int(width * n / 100)
????????nheight = int(height * n / 100)
????????thumb = im.resize((nwidth, nheight), Image.ANTIALIAS)
????????if?format:
????????????thumb.save(file[:(len(file) - 4)] + '_thumb'?+ format)
????????else:
????????????thumb.save(file[:(len(file) - 4)] + '_thumb'?+ file[-4:])
????def?Conv(self):
????????n = 0
????????if?self.mstatus.get():
????????????path = self.entryDir.get()
????????????if?path == "":
????????????????tkinter.messagebox.showerror('出錯(cuò)啦', '請(qǐng)選擇路徑')
????????????????return
????????????filenames = os.listdir(path)
????????????if?self.fstatus.get():
????????????????f = self.Image.get()
????????????????print(f)
????????????????for?filename in?filenames:
????????????????????if?filename[-3:] in?('bmp', 'jpg', 'gif', 'png'):
????????????????????????self.make(path + '/'?+ filename, f)
????????????????????????n += 1
????????????else:
????????????????for?filename in?filenames:
????????????????????if?filename[-3:] in?('bmp', 'jpg', 'gif', 'png'):
????????????????????????self.make(path + '/'?+ filename)
????????????????????????n += 1
????????else:
????????????file = self.entryFile.get()
????????????if?file == '':
????????????????tkinter.messagebox.showerror('出錯(cuò)啦', '請(qǐng)選擇文件')
????????????????return
????????????if?self.fstatus.get():
????????????????f = self.Image.get()
????????????????self.make(file, f)
????????????????n += 1
????????????else:
????????????????self.make(file)
????????????????n += 1
????????self.status.set('成功轉(zhuǎn)換 %d 張圖片'?% n)
????def?mainloop(self):
????????self.root.minsize(280, 270)
????????self.root.maxsize(280, 250)
????????self.root.title('圖片轉(zhuǎn)換')
????????self.root.mainloop()
if?__name__ == "__main__":
????window = Window()
????window.mainloop()



以上三位小伙伴,加小編微信:yumeko370?領(lǐng)取小小紅包一份哦!

評(píng)論
圖片
表情
