1. 程式人生 > >基於Python PIL實現簡單圖片格式轉化器

基於Python PIL實現簡單圖片格式轉化器

## 基於Python PIL實現簡單圖片格式轉化器 [TOC] ## 1、簡介 ​ *提示:閱讀本文,預設你對Python有一定了解,並且安裝有PIL,對tkinter有一定使用基礎。文中所有程式碼皆在Python3版本上實現,請務必注意* ​ Pyhton PIL庫提供了許多圖片處理功能,理論上可以藉助此完成圖片格式轉換功能,在配合Python tkinter庫繪製前端頁面,基本上可以實現一個簡單圖片格式轉換器 ## 2、前期資料準備 ### 2.1邏輯支援 #### 2.1.1如何實現圖片格式轉換? ​ Python PIL庫提供了許多圖片處理功能,現在我們只需要其中一個功能:**圖片格式轉換**支援我們實現我們的圖片格式轉換器。具體如下: ```python from PIL import Image # 引入PIL Image提供圖片格式轉換功能 file_path = 'D:/test/test.png' #測試圖片 photo = Image.open(file_path) photo.save('D:/test/new_test.gif') # save會根據字尾名轉換為特定格式 ``` ​ *注意:在轉換為.jgp格式圖片時,需要將圖片模式轉換為RGB模式,即在save語句之前加上:`photo = photo.convert('RGB')`* 更多參考[PIL save語句說明](https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#jpeg) ​ 當然,這裡我們必須宣告一點:PIL提供的格式轉換支援是有限的,具體參考[PIL支援圖片格式](https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html) #### 2.1.2如何儲存需要大小的圖片? ​ 具體參考: ```python from PIL import Image # 引入PIL Image提供圖片格式轉換功能 file_path = 'D:/test/test.png' #測試圖片 photo = Image.open(file_path) photo = photo.resize((200,300)) # 將圖片大小轉換為(width,height)200x300大小 photo.save('D:/test/new_test.gif') # save會根據字尾名轉換為特定格式 ``` ​ 到此,邏輯支援部分基本上夠我們實現後端的圖片格式轉換了。 ### 2.2前端頁面支援 #### 2.2.1圖片檔案選擇 ​ 通過tkinter.filedialog中的檔案選擇框元件:askopenfilename()返回開啟的圖片檔案的檔案路徑,具體參考: ```python import tkinter.filedialog file_path = tkinter.filedialog.askopenfilename(title = '選擇檔案') print(file_path) ``` ​ `title`引數設定檔案選擇框顯示時的窗體標題 #### 2.2.2 儲存檔案到目標路徑 ​ 通過tkinter.filedialog中的檔案儲存框元件:asksaveasfilename()返回儲存的圖片檔案的檔案路徑,具體參考: ```python import tkinter.filedialog file_savepath = tkinter.filedialog.asksaveasfilename(title = '儲存檔案',filetypes = (('JPG','.jpg'),('PNG','.png'))) print(file_savepath) ``` ​ `title`引數設定檔案選擇框顯示時的窗體標題,`filetypes`引數設定了儲存檔案時提供的檔案格式下拉選項,當前設定會出現如下檔案格式選項: ![](https://img2020.cnblogs.com/blog/2021157/202012/2021157-20201218215804922-1508130874.png) ​ *注意:當前只是前端頁面提供的儲存頁面,實際儲存檔案還是在後端實現* #### 2.2.3預覽圖片 ​ 我們通過一個Label元件實現預覽需要轉換的圖片,為Label中image屬性新增為要載入的圖片。這裡,我們使用PIL中的ImageTk.PhotoImage來載入預覽圖片,而不tkinter.PhotoImage,主要目的是為了使用Image來裁剪圖片來保證預覽圖片大小一致,防止圖片顯示不完全。具體參考下面的例子: ```python import tkinter from PIL import Image, ImageTk file_path = 'D:/test/test.png' root = tkinter.Tk() photo = ImageTk.PhotoImage(Image.open(file_path).resize((200,300))) # 預覽圖片大小為200x300 previewPhoto = tkinter.Label(root, image = photo).pack() root.mainloop() ``` ​ 這裡,由於需要不斷切換Label的image屬性,可能會遇到[Python tkinter之PhotoImage圖片顯示問題](https://blog.csdn.net/m0_50000839/article/details/107920494) #### 2.2.4