基於Python PIL實現簡單圖片格式轉化器
阿新 • • 發佈:2020-12-19
## 基於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