小編給大家分享一下Python已經(jīng)實現(xiàn)圖片批量加入水印代碼實例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的盧龍網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!這篇文章主要介紹了Python實現(xiàn)圖片批量加入水印代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
配置環(huán)境
python3 + pillow
pip3 install pillow
引入庫
from PIL import Image, ImageSequence import os import random
效果預(yù)覽:
使用方法:
在腳本同目錄下添加水印圖片 logo.png
創(chuàng)建目錄 input 并在放入要添加水印的圖片
創(chuàng)建目錄 output 執(zhí)行腳本 addlogo.py
結(jié)果輸出在 output 文件夾下
實現(xiàn)原理
水印圖片采集:
先讀取水印圖片的像素點信息和大小信息。去除透明度為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, 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}')
處理目錄:
對當(dāng)前目錄下的文件做一個篩選,只選取圖片格式的文件。
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 庫來實現(xiàn)。 首先是讀取 logo 圖片信息,接著在隨機一個位置添加混合后的像素點信息,最后再保存起來。
其中,對于 gif 文件的處理是拆幀,再添加水印,最后再組合成一個 gif。這個只能對應(yīng)比較小的 gif 文件處理,如果有更好的方法歡迎留言交流分享!
以上是“Python已經(jīng)實現(xiàn)圖片批量加入水印代碼實例”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。