Python PIL 來製作微信國旗頭像,別再@微信官方了

Python3.7
依賴庫: PIL

提供功能:

  1. 在指定圖像右下角添加圓形小圖標;
  2. 添加指定文字logo到圖像右下角;
  3. 保存融合圖像
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)
        # 華文細黑.ttf字體下載url爲:http://www.onlinedown.net/soft/580653.htm
        draw.text((width - length, height), text, fill='black', font=ImageFont.truetype("華文細黑.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='XXXX.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="@陸壹佛爺製作"
                                         )
    tagger.save_figure(avatar_image=merged_avatar_text,
                       save_path="XXX.png"
                       )

icon.jpg示例(當然可以換成其他任意圖像,例如聖誕標誌等):
在這裏插入圖片描述
左右成果示例:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章