Python添加水印


以下有兩種添加水印的方法,第一種和第二種的區別是實現透明圖層的方式不一樣

一.圖片疊加實現圖層透明

#-*- coding:utf-8 -*-
import requests as req
from mysqlDemo import switchLogoUrl
from io import BytesIO
from PIL import Image, ImageDraw
from PIL import ImageFont
from numpy import *

'''
@param srcImgPath  原圖片的路徑
@param Content1    水印的內容1
@param logoImg     logo圖片路徑
@param Content2    水印的內容2
@param jd          經度
@param wd          緯度
@param siteCode    污染源地址
'''
#font = ImageFont.truetype("C:\Windows\Fonts\微軟雅黑\msyhbd.ttc", 44)
typeface = 'C:\Windows\Fonts\微軟雅黑\msyhbd.ttc'#常規
typefaceBold = 'C:\Windows\Fonts\微軟雅黑\msyhbd.ttc'#粗體


def mark(srcImgPath, Content1, logoImg, Content2, jd, wd, siteCode):
    img1= Image.open(BytesIO(req.get(srcImgPath).content)).convert('RGBA')
    img2 = Image.open(BytesIO(req.get(srcImgPath).content)).convert('RGBA')
    # 第一張圖上加一個畫圖
    draw = ImageDraw.Draw(img1)

    # 黑色  (x0,y0)左上,(x1,y1)右下
    draw.rectangle([img1.size[0]-230, img1.size[1]-550, img1.size[0]-230+200, img1.size[1]-550+450 ],fill='black',outline='black', width=1)
    #把兩張圖疊加添加透明圖層
    image = Image.blend(img1, img2, 0.7)
    #在加了透明圖層的新圖上添加圖層
    draw = ImageDraw.Draw(image)

    # 白框
    draw.rectangle([image.size[0] - 215, image.size[1] - 535, image.size[0] - 215 + 170, image.size[1] - 535 + 420],
                   outline='white', width=1)

    draw.text((image.size[0] - 200, image.size[1] - 510), "AI全息影像告警", "WHITE",
              font=ImageFont.truetype(typeface, 20))  # 設置文字位置/內容/顏色/字體

    # 打開logo圖
    logoim = Image.open(BytesIO(req.get(logoImg).content), 'r')
    # 修改圖片的尺寸,把logo圖片縮小一倍
    out = logoim.resize(((logoim.size[0]) // 2, (logoim.size[1]) // 2), Image.ANTIALIAS)
    #添加水印圖片:第一種為圖片本身顏色,第二種需要指定顏色,默認為白色
    image.alpha_composite(out, (image.size[0] - 160, image.size[1] - 410))
    #draw.bitmap((image.size[0] - 160, image.size[1] - 410), out, fill=128)

    draw.text((image.size[0] - 200, image.size[1] - 460), Content1, "WHITE", font=ImageFont.truetype(typefaceBold, 34))
    draw.text((image.size[0] - 190, image.size[1] - 340), "區域實時AQI", "WHITE", font=ImageFont.truetype(typefaceBold, 20))
    if (int(Content2) > 99) & (int(Content2) < 1000):
        draw.text((image.size[0] - 170, image.size[1] - 310), str(Content2), "WHITE",
                  font=ImageFont.truetype(typeface, 40))
    elif (int(Content2)) < 10:
        draw.text((image.size[0] - 145, image.size[1] - 310), str(Content2), "WHITE",
                  font=ImageFont.truetype(typeface, 40))
    else:
        draw.text((image.size[0] - 150, image.size[1] - 310), str(Content2), "WHITE",
                  font=ImageFont.truetype(typeface, 40))
    draw.text((image.size[0] - 190, image.size[1] - 260), "污染源經緯度", "WHITE", font=ImageFont.truetype(typefaceBold, 20))

    draw.text((image.size[0] - 190, image.size[1] - 230), "經度:" + str(jd), "WHITE",
              font=ImageFont.truetype(typeface, 15))
    draw.text((image.size[0] - 190, image.size[1] - 200), "緯度:" + str(wd), "WHITE",
              font=ImageFont.truetype(typeface, 15))

    draw.text((image.size[0] - 190, image.size[1] - 170), "污染源地址:", "WHITE", font=ImageFont.truetype(typefaceBold, 15))
    draw.text((image.size[0] - 110, image.size[1] - 170), siteCode[0:3], "WHITE", font=ImageFont.truetype(typeface, 15))
    draw.text((image.size[0] - 190, image.size[1] - 140), siteCode[3:], "WHITE", font=ImageFont.truetype(typeface, 15))

    draw = ImageDraw.Draw(image)

    image.show()
    image.save("D://tmp//TIMING.png")



img_src = "http://139.159.250.114:22816/20200611/E10550120/111.59.168.168_01_20200611092607736_TIMING.jpg"
Content1="秸稈焚燒"

#更具mtype的值返回logo圖片
logoImg=switchLogoUrl.switcher.get(int(14))()
print(logoImg)
Content2=100
jd=109.27713
wd=21.5076
siteCode="北鐵機場高速"

mark(img_src,Content1,logoImg,Content2,jd,wd,siteCode,)

 

效果圖:

 

 

 

 

二.指定位置添加透明圖層

#-*- coding:utf-8 -*-
from mysqlDemo import switchLogoUrl
import requests as req
import uuid
from io import BytesIO
from PIL import Image, ImageDraw
from PIL import ImageFont
from numpy import *

'''
@param srcImgPath  原圖片的路徑
@param Content1    水印的內容1
@param logoImg     logo圖片路徑
@param Content2    水印的內容2
@param jd          經度
@param wd          緯度
@param siteCode    污染源地址
'''
typeface = 'C:\Windows\Fonts\微軟雅黑\msyhbd.ttc'#常規
typefaceBold = 'C:\Windows\Fonts\微軟雅黑\msyhbd.ttc'#粗體


def mark(srcImgPath, Content1, logoImg, Content2, jd, wd, siteCode):
    image= Image.open(BytesIO(req.get(srcImgPath).content)).convert('RGBA')
    # 第一張圖上加一個畫圖
    draw = ImageDraw.Draw(image)

    # 黑色  (x0,y0)左上,(x1,y1)右下,這種需要合並兩個圖層達到圖層透明
    #draw.rectangle([image.size[0]-230, image.size[1]-550, image.size[0]-230+200, image.size[1]-550+450 ],fill='black',outline='black', width=1)
    #指定區域位置設置透明度
    b=(0,0,0) #黑色
    opacity=0.3
    #橫坐標開始位置,結束位置
    for x in range(image.size[0]-230,image.size[0]-230+200):
        #縱坐標的開始位置,結束位置
         for y in range(image.size[1]-550,image.size[1]-550+450 ):
             p = image.getpixel((x, y))
             p = [int(p[i] * (1 - opacity) + b[i] * opacity) for i in range(3)]
             image.putpixel((x, y), tuple(p))

    #在加了透明圖層的新圖上添加圖層
    draw = ImageDraw.Draw(image)

    # 白框
    draw.rectangle([image.size[0] - 215, image.size[1] - 535, image.size[0] - 215 + 170, image.size[1] - 535 + 420],
                   outline='white', width=1)

    draw.text((image.size[0] - 200, image.size[1] - 510), "AI全息影像告警", "WHITE",
              font=ImageFont.truetype(typeface, 20))  # 設置文字位置/內容/顏色/字體

    # 打開logo圖
    logoim = Image.open(BytesIO(req.get(logoImg).content), 'r')
    # 修改圖片的尺寸,把logo圖片縮小一倍
    out = logoim.resize(((logoim.size[0]) // 2, (logoim.size[1]) // 2), Image.ANTIALIAS)
    #添加水印圖片:第一種為圖片本身顏色,第二種需要指定顏色,默認為白色
    image.alpha_composite(out, (image.size[0] - 160, image.size[1] - 410))
    #draw.bitmap((image.size[0] - 160, image.size[1] - 410), out, fill=128)

    draw.text((image.size[0] - 200, image.size[1] - 460), Content1, "WHITE", font=ImageFont.truetype(typefaceBold, 34))
    draw.text((image.size[0] - 190, image.size[1] - 340), "區域實時AQI", "WHITE", font=ImageFont.truetype(typefaceBold, 20))
    if (int(Content2) > 99) & (int(Content2) < 1000):
        draw.text((image.size[0] - 170, image.size[1] - 310), str(Content2), "WHITE",
                  font=ImageFont.truetype(typeface, 40))
    elif (int(Content2)) < 10:
        draw.text((image.size[0] - 145, image.size[1] - 310), str(Content2), "WHITE",
                  font=ImageFont.truetype(typeface, 40))
    else:
        draw.text((image.size[0] - 150, image.size[1] - 310), str(Content2), "WHITE",
                  font=ImageFont.truetype(typeface, 40))
    draw.text((image.size[0] - 190, image.size[1] - 260), "污染源經緯度", "WHITE", font=ImageFont.truetype(typefaceBold, 20))

    draw.text((image.size[0] - 190, image.size[1] - 230), "經度:" + str(jd), "WHITE",
              font=ImageFont.truetype(typeface, 15))
    draw.text((image.size[0] - 190, image.size[1] - 200), "緯度:" + str(wd), "WHITE",
              font=ImageFont.truetype(typeface, 15))

    draw.text((image.size[0] - 190, image.size[1] - 170), "污染源地址:", "WHITE", font=ImageFont.truetype(typefaceBold, 15))
    draw.text((image.size[0] - 110, image.size[1] - 170), siteCode[0:3], "WHITE", font=ImageFont.truetype(typeface, 15))
    draw.text((image.size[0] - 190, image.size[1] - 140), siteCode[3:], "WHITE", font=ImageFont.truetype(typeface, 15))

    draw = ImageDraw.Draw(image)
    return image



#Python   UUID的調用
print(str(uuid.uuid1()).replace("-",''))

img_src = "http://139.159.250.114:22816/20200611/E10550120/111.59.168.168_01_20200611092607736_TIMING.jpg"
Content1="秸稈焚燒"
 #更具mtype的值返回logo圖片
logoImg=switchLogoUrl.switcher.get(int(14))()
print(logoImg)
Content2=100
jd=109.27713
wd=21.5076
siteCode="北鐵機場高速"

img=mark(img_src,Content1,logoImg,Content2,jd,wd,siteCode,)
img.show()

 

 

效果圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM