微信头像加国旗python源码

##微信头像加国旗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"
                   )
发布了46 篇原创文章 · 获赞 2 · 访问量 9379

猜你喜欢

转载自blog.csdn.net/qq_33009107/article/details/101673318