?我們?cè)诰W(wǎng)上瀏覽一些文章的時(shí)候,經(jīng)常會(huì)發(fā)現(xiàn)文章中會(huì)有一些圖片竟闪,上面會(huì)有一些標(biāo)識(shí)离福,而這些標(biāo)識(shí)就是我們經(jīng)常說(shuō)的水印了。很多時(shí)候炼蛤,我們需要給圖片加上一些修飾妖爷,好讓別人能直觀的認(rèn)識(shí)到這個(gè)圖片的出處以及來(lái)源,同時(shí)還能有效防止別人盜圖理朋。
實(shí)現(xiàn)對(duì)圖片的批量添加水印絮识,可以告別繁瑣的工作,增加工作效率嗽上。而對(duì)于添加水印和重命名次舌,我們用到的模塊有pillow,os,開(kāi)發(fā)工具 sublime text 3兽愤。
一垃它、單張圖片添加水印文字
下載并導(dǎo)入所需模塊
pip install pillow #下載pillow模塊
from PIL import Image #導(dǎo)入,下同
from PIL import ImageDraw
from PIL import ImageFont
打開(kāi)圖片文件
im=Image.open('12.jpg')
構(gòu)建畫(huà)圖對(duì)象
draw=ImageDraw.Draw(im)
導(dǎo)入字體文件
ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',size=40)#導(dǎo)入字體文件
修改水印顏色
draw.ink = 0 + 0 * 256 + 255 * 256 * 256 # 顏色
添加水印
draw.text([200,200],text,'red',font=Font) # 文字加載到圖片上
保存文件
im.save('12.png','png') #保存圖片
完整代碼如下:
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
im=Image.open('12.jpg')
draw=ImageDraw.Draw(im)
text = '我愛(ài)你'
Font=ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',size=40)#導(dǎo)入字體文件
draw.ink = 0 + 0 * 256 + 255 * 256 * 256 # 顏色
draw.text([200,200],text,'red',font=Font) # 文字加載到圖片上
im.save('12.png','png') #保存圖片
im.show() #顯示圖片
完成之后的效果是這樣的:
可以看出我愛(ài)你三個(gè)打字就被刻在了上面烹看。
二国拇、單張圖片添加水印圖片
這樣就完成了圖片的首次文字水印,當(dāng)然你也可以弄一個(gè)圖片水印惯殊,只需加一層圖層即可酱吝,比如我要將劉亦菲加在這個(gè)滿是英文的圖片上,就可以這樣做:
導(dǎo)入相關(guān)模塊
from PIL import Image
導(dǎo)入原圖片和水印圖片并得出原圖片大小
im = Image.open('12.jpg') # 打開(kāi)圖片
im1= Image.open('11.jpg') # 打開(kāi)水印圖片
w,h= im.size
重新設(shè)置水印圖片大小土思,保證圖片不會(huì)與原圖重疊并溢出
mm=im1.resize((80,40),Image.ANTIALIAS) #重新設(shè)置水印圖片大小
設(shè)置水印圖片位置
position = (w-100,h-100) # 默認(rèn)設(shè)定水印位置為右下角
新建圖層
layer = Image.new('RGB', im.size) # 新建一個(gè)圖層
將水印圖片添加到圖層上
layer.paste(mm, position) # 將水印圖片添加到圖層上
合并水印和原圖片為一張圖
im2= Image.composite(layer, im, layer)#合并圖片
保存圖片
im2.save('21.jpg') #保存圖片
完整代碼如下:
from PIL import Image
im = Image.open('12.jpg') # 打開(kāi)圖片
im1= Image.open('11.jpg') # 打開(kāi)水印圖片
w,h= im.size
mm=im1.resize((80,40),Image.ANTIALIAS) #重新設(shè)置水印圖片大小
position = (w-100,h-100) # 默認(rèn)設(shè)定水印位置為右下角
layer = Image.new('RGBA', im.size) # 新建一個(gè)圖層
layer.paste(mm, position) # 將水印圖片添加到圖層上
im2= Image.composite(layer, im, layer)#合并圖片
im2.save('21.jpg') #保存圖片
這樣即可完成水印圖片的填充务热。效果圖如下:
三、批量給圖片添加水印文字
但是我們要做的是批量給圖片添加水印效果啊己儒,所以現(xiàn)在我們需要用到某些系統(tǒng)模塊崎岂,比如os。既然是批量闪湾,那我們肯定得先獲取到某個(gè)目錄所有圖片文件了冲甘,我們可以這樣做:
1.遍歷指定目錄所有圖片文件
def search(path):
for x in os.listdir(path): #遍歷目錄下的所有文件和文件夾
if os.path.isfile(x) and x.endswith('.jpg'): #判斷文件x是否文件且它的后綴是否是.jpg
yield x #生成器
for y in search(r'C:\Users\Administrator\Desktop'):
ger(y) #桌面上所有的JPG文件
獲取到了之后了我們就可以逐個(gè)讀取到圖片信息啦。
2.添加水印
接下來(lái)我們就可以寫(xiě)代碼了,首先還是先寫(xiě)添加文字水印江醇,如何批量添加了濒憋,那肯定是把這些逐個(gè)讀取到的圖片一個(gè)個(gè)打上文字水印啦,不過(guò)記得加一個(gè)睡眠時(shí)間陶夜,因?yàn)閳D片一下子全部讀取保存會(huì)很耗費(fèi)內(nèi)存的凛驮,那么下面就跟小編一起來(lái)打水印吧。還是原來(lái)的套路条辟,這里我就不細(xì)說(shuō)了黔夭,免得大家說(shuō)我像老太婆的裹腳布一樣,直奔主題羽嫡,上代碼:
from time import sleep
from PIL import mage
from PIL import ImageDraw
from PIL import ImageFont
a=0 #初始化圖片編號(hào)
def search(path):
for x in os.listdir(path): #遍歷目錄下的所有文件和文件夾
if os.path.isfile(x) and x.endswith('.jpg'): #判斷文件x是否文件且它的后綴是否是.jpg
yield x #生成器
def ger(x):
font = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',size=40) #添加字體文件和字體大小
im=Image.open(x)
draw = ImageDraw.Draw(im) #構(gòu)建畫(huà)圖對(duì)象
draw.text((im.size[0]-330,im.size[1]-85), '我愛(ài)你', fill='blue',font=font)#添加水印
dir = r'C:\Users\Administrator\Desktop\tp' #保存位置
filename = os.path.join(dir,str(a)+'.jpg') #保存文件名
sleep(1) #睡眠時(shí)間
im.save(filename) #保存文件
for y in search(r'C:\Users\Administrator\Desktop'):
a=a+1 #每次開(kāi)始保存文件纠修,a就加一
ger(y) #添加水印并保存圖片
最后結(jié)果就如下圖所示:四、批量給圖片添加水印圖片
可以看出已經(jīng)對(duì)桌面上所有的JPG文件添加了水印厂僧,水印文字為‘我愛(ài)你’,批量添加水印圖片也是差不多的套路了牛,只需把添加單個(gè)水印圖片代碼稍加改動(dòng)即可颜屠,下面請(qǐng)看:
from time import sleep
完成后效果如圖:可以看出,我們桌面上的每一張圖片基本上就已經(jīng)能夠打上水印了鹰祸,是不是很簡(jiǎn)單了甫窟。
五、批量文件名重命名
在這里蛙婴,小編還要給大家另外傳授一個(gè)絕招粗井,那就是批量文件改名了,也是相當(dāng)?shù)暮?jiǎn)單的說(shuō):
from time import sleep
from PIL import Image
import datetime
from PIL import ImageDraw
from PIL import ImageFont
a=0
def search(path):
for x in os.listdir(path):
if os.path.isfile(x) and x.endswith('.jpg'):
yield x
def ger(x):
im=Image.open(x)
w,h= im.size
im1= Image.open(r'C:\Users\Administrator\Desktop\11.jpg') #打開(kāi)水印圖片
mm=im1.resize((80,40),Image.ANTIALIAS) #重新設(shè)置水印圖片大小
position = (w-100,h-100) # 默認(rèn)設(shè)定水印位置為右下角
layer = Image.new('RGBA', im.size) # 新建一個(gè)圖層
layer.paste(mm, position) # 將水印圖片添加到圖層上
im2= Image.composite(layer, im, layer)#合并圖片
dir = r'C:\Users\Administrator\Desktop\tp'
filename = os.path.join(dir,str(a)+'.png') #要保存的文件名
sleep(1) #睡眠時(shí)間
im2.save(filename) #保存文件
for y in search(r'C:\Users\Administrator\Desktop'):
a=a+1
ger(y)
運(yùn)行后效果如圖:如果你想平時(shí)用于修改文件名和加水印這些繁瑣操作的話街图,也可以將小編寫(xiě)的這些功能封裝到一個(gè)類模型里浇衬,然后做一個(gè)界面出來(lái)以方便別人使用,在這里由于時(shí)間關(guān)系小編就不寫(xiě)了餐济。
總的來(lái)說(shuō)該項(xiàng)目并沒(méi)有多大的難點(diǎn)耘擂,唯一要注意的就是只有png圖片在RGBA模式下設(shè)置alpha值才可以進(jìn)行透明度設(shè)置,所以我并沒(méi)有用這個(gè)雞肋的功能絮姆,最后祝大家能學(xué)以致用醉冤,學(xué)有所成。