##微信头像加国旗python源码
from PIL import Image, ImageDraw, ImageFont
import logging
class AvatarTagger(object):
def __init__(self):
self.border = 30
self.merge_method = None
self.avatar = None
self.avatar_size = None
self.icon = None
self.icon_size = None
@staticmethod
def load_images(avatar_path, icon_path):
logging.warning("建议头像图像的大小在1000*1000像素大小,最好是正方形,否则图像会处理变形!")
avatar_image = Image.open(avatar_path).convert("RGBA")
avatar_image = avatar_image.resize((1080, 1080), Image.ANTIALIAS)
return avatar_image, Image.open(icon_path).convert("RGBA")
def process_images(self, avatar_image, icon_image, method='rightDown-circle'):
self.merge_method = method
if self.merge_method == "rightDown-circle":
# 头像图像处理
avatar_image_size = min(avatar_image.size)
reset_avatar_image = Image.new('RGBA',
(avatar_image_size + self.border * 2, avatar_image_size + self.border * 2),
(255, 255, 255))
reset_avatar_image.paste(avatar_image, (self.border, self.border))
self.avatar = reset_avatar_image
self.avatar_size = avatar_image_size
icon_image_size = 260
icon_image = icon_image.resize((icon_image_size, icon_image_size), Image.ANTIALIAS)
reset_icon_image = Image.new('RGBA', (icon_image_size, icon_image_size), (255, 255, 255, 0))
p_image = icon_image.load() # 像素的访问对象
preset_icon_image = reset_icon_image.load()
r = float(icon_image_size / 2) # 圆心横坐标
r3 = int(icon_image_size // 2)
for i in range(icon_image_size):
for j in range(icon_image_size):
lx = abs(i - r) # 到圆心距离的横坐标
ly = abs(j - r) # 到圆心距离的纵坐标
l = (pow(lx, 2) + pow(ly, 2)) ** 0.5 # 三角函数半径
if l < r3:
preset_icon_image[i - (r - r3), j - (r - r3)] = p_image[i, j]
self.icon = reset_icon_image
self.icon_size = icon_image_size
return (self.avatar, self.avatar_size), (self.icon, self.icon_size)
def merge(self, avatar_image, avatar_image_size, icon_image, icon_image_size):
r, g, b, a = icon.split()
locate = avatar_image_size + self.border // 2 - icon_image_size
avatar_image.paste(icon_image, (locate, locate), mask=a)
return avatar_image
@staticmethod
def add_text(avatar_image, text):
size = avatar_image.size
width = size[0] - 150
height = size[1] - 25
length = len(text) * 3
draw = ImageDraw.Draw(avatar_image)
draw.text((width - length, height), text, fill='black', font=ImageFont.truetype("STXIHEI.TTF", 20))
return avatar_image
@staticmethod
def save_figure(avatar_image, save_path):
if ".png" not in save_path:
raise PermissionError("保存图片必须是png格式的")
avatar_image.save(save_path)
@staticmethod
def show_figure(avatar_image):
avatar_image.show()
if __name__ == '__main__':
tagger = AvatarTagger()
avatar, icon = tagger.load_images(avatar_path='webwxgeticon.jpg',
icon_path='icon.jpg')
(avatar, avatar_size), (icon, icon_size) = tagger.process_images(
avatar_image=avatar,
icon_image=icon
)
merged_avatar = tagger.merge(avatar_image=avatar,
avatar_image_size=avatar_size,
icon_image=icon,
icon_image_size=icon_size)
merged_avatar_text = tagger.add_text(avatar_image=merged_avatar,
text="@kerry制造"
)
tagger.save_figure(avatar_image=merged_avatar_text,
save_path="wx.png"
)