在一般的给图片添加水印的时候,PIL的paste方法基本可以满足一些简单的需求。但是一旦当数据量较大的时候,new操作和paste操作将占用大量的cpu,谁用谁知道。
因此在使用的时候需要使用numpy作为中间项来提高效率
下面我给了一个案例,图片自己按位置添加
import os
import time
import base64
from PIL import Image, ImageFont, ImageDraw
from io import BytesIO,StringIO
import binascii
import numpy as np
import cv2
import matplotlib.pyplot as plt
def base64_to_image(base64_str):
byte_data = base64.b64decode(base64_str)
image_data = BytesIO(byte_data)
img = Image.open(image_data)
return img
def image_to_base64(img):
output_buffer = BytesIO()
img.save(output_buffer, format='jpeg')
byte_data = output_buffer.getvalue()
base64_str = base64.b64encode(byte_data)
imageName='imgs.jpg'
imageName2='imgs_new.jpeg'
#全局变量
text = '水印'
text_color = '#ff0000'
#接收端 base64转图片存贮注意RGB顺序
with open(imageName, 'rb') as imageFile:
#从这边开始业务逻辑
#生成测试需要用的base64码
newcode_1 = base64.b64encode(imageFile.read())
#base64 转 PIL
img=base64_to_image(newcode_1)
w=img.width
h=img.height
img_new=img.convert('RGBA')
font = ImageFont.truetype('simhei.ttf',10)
text_overlay = Image.new('RGBA', (w,h), (0, 0, 0, 0))
image_draw = ImageDraw.Draw(text_overlay)
#image_draw.text((w-50,h-30), text, fill=text_color, font=font)
image_draw.text((w-40,h-10), text, fill=text_color, font=font)
out = Image.alpha_composite(img_new, text_overlay)
array_img = np.array(out)
retval, buffer = cv2.imencode('.jpg', array_img)
pic_str = base64.b64encode(buffer)
#输出的base64
'''
img_ImageFile=base64_to_image(pic_str)
cv2.namedWindow("Image")
#img_print = cv2.cvtColor(np.asarray(img_ImageFile),cv2.COLOR_RGB2BGR)
cv2.imshow("Image", np.asarray(img_ImageFile))
cv2.waitKey(0)
'''
imageFile.close()