iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Software Development

學 Python 到底可以幹麻勒?系列 第 7

( Day 7 ) 圖片加上 logo 浮水印

  • 分享至 

  • xImage
  •  

這篇文章會介紹使用 Python 的 Pillow 第三方函式庫,將圖片加上 logo 浮水印 ( 使用圖片作為浮水印 ),並嘗試做出半透明的浮水印效果,最後還會搭配 glob 函式庫,實現批次加浮水印的功能。

原文參考:圖片加上 logo 浮水印

Python 教學 - 圖片加上 logo 浮水印

安裝 Pillow

輸入下列指令安裝 Pillow,根據個人環境使用 pip 或 pip3,如果使用 Colab 或 Anaconda Jupyter,已經內建 Pillow 函式庫。

!pip install Pillow

準備浮水印的圖片

圖片浮水印是使用一張「背景透明」的圖片作為浮水印,支援背景透明圖片的常見格式有 png、gif、svg,考量支援度與色彩深度,通常會使用 png 的圖片,下方準備了兩張圖,一張是背景照片 photo,一張是作為浮水印的 icon ( 背景透明的愛心 ),可先行下載到電腦中。

Python 教學 - 圖片加上 logo 浮水印

貼上浮水印

載入 Pillow 函式庫的 Image 模組,分別將兩張圖片開啟為 img 和 icon,接著使用 paste 方法,將 icon 貼到 img 上方,存檔後就會看到風景圖上出現愛心的浮水印,paste 方法有三個參數,第一個參數為要貼上的圖片,第二個參數為貼上的座標位置 ( 左上角 ),第三個參數為遮色片,當遮色片與第一個參數為同一張圖,就會採用原圖的 alpha 遮罩設定,因此如果原圖已經是去背的圖片,就會將背景變成透明 ( 如果沒有設定,透明的位置會是全黑或全白 )。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

from PIL import Image
img = Image.open('./watermark-photo.jpg')    # 開啟風景圖
icon = Image.open('./oxxostudio-icon.png')   # 開啟浮水印 icon
img.paste(icon, (0,0), icon)     # 將風景圖貼上 icon
img.save('./ok.jpg')             # 存檔為 ok.jpg
# img.show()  # Colab 不支援直接顯示,如果使用本機環境會開啟圖片檢視器

Python 教學 - 圖片加上 logo 浮水印

如果要將 icon 置中,可以透過兩張圖片尺寸的換算,就能計算出置中時 icon 左上角的座標位置。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

from PIL import Image
img = Image.open('./watermark-photo.jpg')
icon = Image.open('./oxxostudio-icon.png')

img_w, img_h = img.size      # 取得風景圖尺寸
icon_w, icon_h = icon.size   # 取得 icon 尺寸
x = int((img_w-icon_w)/2)    # 計算置中時 icon 左上角的 x 座標
y = int((img_h-icon_h)/2)    # 計算置中時 icon 左上角的 y 座標

img.paste(icon, (x, y), icon)   # 設定 icon 左上角座標
img.save('./ok.jpg')

Python 教學 - 圖片加上 logo 浮水印

同理,只要改變計算的公式,就能將 icon 擺放在右下角的位置。

x = int(img_w-icon_w)    # 計算 icon 在右下的 x 座標
y = int(img_h-icon_h)    # 計算 icon 在右下的 y 座標

Python 教學 - 圖片加上 logo 浮水印

搭配 glob,批次加浮水印

了解加入浮水印的方法後,使用 glob 標準函式庫讀取 demo 資料夾裡所有的 jpg 檔案,就能批次加入浮水印。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

import glob
from PIL import Image
imgs = glob.glob('./demo/*.jpg')     # 讀取 demo 資料夾裡所有的圖片
icon = Image.open('./oxxostudio-icon.png')
for i in imgs:
    name = i.split('/')[::-1][0]   # 取得圖片名稱
    img = Image.open(i)            # 開啟圖片
    img.paste(icon, (0,0), icon)   # 加入浮水印
    img.save(f'./demo/watermark/{name}')   # 以原本的名稱存檔

Python 教學 - 圖片加上 logo 浮水印

調整浮水印透明度

由於 PIL 裡調整透明度的 putalpha 方法,會調整 RGBA 裡的 A ( alpha ) 色版數值,如果作為浮水印本身是去背的圖片,會造成去背的部分也受到影響 ( 因為去背位置的像素包含了 alpha 資訊 ),因此如果要做到半透明的浮水印,可以先產生一張完全不透明的圖 ( 有浮水印的 ),然後再調整這張圖的透明度,與原本沒有浮水印的圖結合,就會產生半透明的浮水印效果

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

from PIL import Image
img = Image.open('./watermark-photo.jpg')     # 準備合成浮水印的圖
img2 = Image.open('./watermark-photo.jpg')    # 底圖
icon = Image.open('./oxxostudio-icon.png')

img_w, img_h = img.size
icon_w, icon_h = icon.size
x = int((img_w-icon_w)/2)
y = int((img_h-icon_h)/2)
img.paste(icon, (x, y), icon)   # 合成浮水印
img.convert('RGBA')             # 圖片轉換為 RGBA 模式 ( 才能調整 alpha 色版 )
img.putalpha(100)               # 調整透明度,範圍 0~255,0 為全透明
img2.paste(img,(0,0),img)       # 合成底圖
img2.save('./ok.jpg')

Python 教學 - 圖片加上 logo 浮水印

小結

如果要對自己的圖片進行保護,加入浮水印是個不錯的做法,透過這個範例,就能自己做出批次加入浮水印的程式。

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 6 ) 拼接多張圖片
下一篇
( Day 8 ) 圖片加上文字浮水印
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言