1. 程式人生 > 程式設計 >Python實現圖片批量加入水印程式碼例項

Python實現圖片批量加入水印程式碼例項

這篇文章主要介紹了Python實現圖片批量加入水印程式碼例項,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

寫文章的時候可以設定是否新增水印。可是,有些圖片可能想加水印,有些不想加水印,該怎麼辦呢?

配置環境

python3 + pillow

pip3 install pillow

引入庫

from PIL import Image,ImageSequence
import os
import random

效果預覽:

使用方法:

  • 在指令碼同目錄下新增水印圖片 logo.png
  • 建立目錄 input 並在放入要新增水印的圖片
  • 建立目錄 output 執行指令碼 addlogo.py
  • 結果輸出在 output 資料夾下

實現原理

水印圖片採集:

先讀取水印圖片的畫素點資訊和大小資訊。去除透明度為0的畫素,並修改透明度畫素資訊。

img_logo = Image.open("logo.png")
img_logo_width,img_logo_height = img_logo.size
img_logo_pixels = dict()
for w in range(img_logo_width):
  for h in range(img_logo_height):
    c = img_logo.getpixel((w,h))
    if c!=(0,0):
      img_logo_pixels[(w,h)] = c[:3]+(125,)

混合顏色:

對每一個畫素點採取顏色混合,其中c1是源圖片的畫素點資訊(r,g,b,a),c2是logo圖片畫素點的資訊。混合演算法如下:

def blendPixel(c1,c2):
  a1=256-c2[3]
  a2=c2[3]-(a1*c2[3])/256.0
  a=a1+a2
  c=(int((a1*c1[0] + a2*c2[0])/a),int((a1*c1[1] + a2*c2[1])/a),int((a1*c1[2] + a2*c2[2])/a),int(a))
  return c

處理源 Image 物件:

隨機一個位置開始處理畫素,具體程式碼參考如下。

def dealOneImage(image,offX=None,offY=None):
  w,h = image.size
  offX = offX if offX else random.random();
  offY = offY if offY else random.random();
  #如果圖片尺寸小於水印圖片,不加水印
  if w>=img_logo_width and h>=img_logo_height:
    top = int((w - img_logo_width)*offX)
    left = int((h - img_logo_height)*offY)
    for p,c in img_logo_pixels.items():
      p_x = (p[0]+top)
      p_y = (p[1]+left)
      image_c = image.getpixel((p_x,p_y))
      if(isinstance(image_c,tuple) and len(image_c)>2):
        image.putpixel((p_x,p_y),blendPixel(image_c,c))
  return image;

處理單個檔案:

對於 gif 檔案先拆成一張一張圖片,在圖片上新增水印,最後再合成 gif 。對於其他格式的圖片檔案可以多新增幾個水印。最後輸出儲存到 output 資料夾下。

def dealOneFile(filePath):
  img_orign = Image.open(filePath)
  _,file_type = os.path.splitext(filePath)
  basename = os.path.basename(filePath)
  if file_type == '.gif':
    sequence = [];
    offX=random.random()
    offY=random.random()
    for f in ImageSequence.Iterator(img_orign):
      if len(sequence) % 2 == 0:
        offX=random.random()
        offY=random.random()
      sequence.append(dealOneImage(f.convert(),offX,offY))
    sequence[0].save(f'./output/{basename}',save_all=True,append_images=sequence[1:])
  else:
    image_out = (dealOneImage(img_orign))
    for x in range(1):
      image_out = (dealOneImage(image_out))
    image_out.save(f'./output/{basename}')

處理目錄:

對當前目錄下的檔案做一個篩選,只選取圖片格式的檔案。

def dealSrc(srcDir):
  picFiles = [os.path.join(srcDir,fn) for fn in os.listdir(srcDir) if fn.endswith(('.gif','.jpg','.png','.jpeg'))]
  for filePath in picFiles:
    dealOneFile(filePath)

小結

新增水印主要用了 python3 中的 pillow 庫來實現。 首先是讀取 logo 圖片資訊,接著在隨機一個位置新增混合後的畫素點資訊,最後再儲存起來。

其中,對於 gif 檔案的處理是拆幀,再新增水印,最後再組合成一個 gif。這個只能對應比較小的 gif 檔案處理,如果有更好的方法歡迎留言交流分享!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。