#縮圖練習
'''
pip install Pillow
open() : 開啟檔案
new() : 新建影像
paste(來源影像, (座標xy), 遮色片) : 貼上影像
遮色片參數會使用Alpha色板當作透明
thumbnail() : 縮小影像 (size: tuple[int, int]
show() : 顯示影像
save() : 儲存影像
size : 尺寸屬性
convert(mode=None, matrix=None, dither=None, palette=0, colors=256) : 轉換圖片
'''
from PIL import Image
thumb_size = (300, 300) # 設定最大縮圖尺寸,tuple型態
img = Image.open(r'project\face\IMG\ai_deepfake_t.png') # 打開圖片,使用r''防止逃逸字元
img.thumbnail(thumb_size) # 縮小圖片,使用設定好的尺寸
print(img.size) # 確認縮小的影像(287, 300),等比例縮小而不是(300, 300)
img.show() # 檢視影像
img.save('project/face/thumb/1.png') # 設定存檔路徑(\換成/),如果使用jpg圖檔則quality='數字'是選填,數字0~100,數字越大jpg品質越高
# 由於png和jpeg圖片通道數不同所以不能使用quality
# png除了rgb還多了a(Alpha)通道
# 或者直接轉換圖片通道
img = img.convert('RGB') # 大寫
img.save('project/face/thumb/1_rgba_to_rgb_qu80.jpg', quality=80) # 檔案若存在則直接取代
img_w, img_h = img.size # 分別儲存tuple的數值
logo = Image.open(r'project\face\IMG\logo.png') # 設定浮水印檔案
logo_w, logo_h = logo.size
# 浮水印是由logo左上角的點去定位的
x = img_w - logo_w - 20 # 因為是以左上角去定位,加了20表示預留右邊邊界20像素
y = img_h - logo_h - 20 # 同上,預留20下面邊界
img.paste(logo,(x, y), logo)
img.save('project/face/thumb/1.png')
img.save('project/face/thumb/1_rgba_to_rgb_qu80.jpg', quality=80)
from PIL import Image
thumb_size = (300, 300) # 設定最大縮圖尺寸,tuple型態
img = Image.open(r'project\face\IMG\ai_deepfake_t.png') # 打開圖片,使用r''防止逃逸字元
img.thumbnail(thumb_size) # 縮小圖片,使用設定好的尺寸
print(img.size) # 確認縮小的影像(287, 300),等比例縮小而不是(300, 300)
img.save('project/face/thumb/1.png') # 設定存檔路徑(\換成/),如果使用jpg圖檔則quality='數字'是選填,數字0~100,數字越大jpg品質越高
# 由於png和jpeg圖片通道數不同所以不能使用quality
# png除了rgb還多了a(Alpha)通道
# 或者直接轉換圖片通道
img_w, img_h = img.size # 分別儲存tuple的數值
logo = Image.open(r'project\face\IMG\logo.png') # 設定浮水印檔案
logo_w, logo_h = logo.size
# 浮水印是由logo左上角的點去定位的
x = img_w - logo_w - 20 # 因為是以左上角去定位,加了20表示預留右邊邊界20像素
y = img_h - logo_h - 20 # 同上,預留20下面邊界
img.paste(logo,(x, y), logo)
img.save('project/face/thumb/1.png')
# 由於需存檔成PNG維持透明,所以取消轉換(img = img.convert('RGB'))
import os
from PIL import Image
# 合成浮水印的自訂函數
def watermark(src_dir='img',
save_dir='thumb',
logo_dir='logo',
logo_img='logo.png',
size=600,
margin=20
):
thumb_size = (size, size) # 設定縮圖尺寸
logo_path = os.path.join(logo_dir, logo_img) # 設定浮水印路徑,需在工作目錄下,把目錄和文件結合成路徑
logo = Image.open(logo_path)
logo_w, logo_h = logo.size
for f in os.listdir(src_dir): # 把目錄的檔案用for迴圈取出
if f.endswith('.jpg') or f.endswith('.png'): # 判斷是否為.jpg結尾
img_path = os.path.join(src_dir, f) # 把目錄和文件結合成路徑
img = Image.open(img_path) # 打開圖片存入變數img
img.thumbnail(thumb_size) # 縮小影像
img_w, img_h = img.size # 取得縮圖尺寸
x = img_w - logo_w - margin # 計算浮水印位置
y = img_h - logo_h - margin
img.paste(logo, (x, y), logo) # 貼上浮水印、設定座標、設定遮色片
save_path = os.path.join(save_dir, f) # 設定存檔路徑
img.save(save_path) # quality默認為75,避免使用png圖檔出錯
if __name__ == '__main__':
watermark()