PIL、Pillow筆記

#縮圖練習
'''
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()

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *