最近图片侵权事件很多啊,虽然何三笔记只是一个小小站,但也不想这种事件放生在自己的身上,于是抽空用python3开发了一个小工具,可根据配置文件生成想要的图片,这只是一个雏形,我的想法是把这个脚本融入到h3blog博客系统当中,真正意义上解决博客系统图源的问题。话不不说直接看代码。

源代码

class H3blogDrow:
    '''自定义图片样式'''
    def __init__(self) -> None:
        self.width = 800
        self.heigth = 400
        self.background_img = ''
        self.background_color = (42, 41, 55)
        self.layers = []
        self.convas = None

    def parse_config(self, config: Dict) -> None:
        c = config
        self.convas = None
        self.width = c.get('width', 800)
        self.heigth = c.get('height', 400)
        self.background_color = tuple([int(i) for i in c.get('background_color', '').split(',')])
        self.background_img = c.get('background_img', (42, 41, 55))

        layers = c.get('layers', None)
        if not layers:
            return
        self.layers.extend(layers)

    def _create_canvas(self) -> None:
        self.convas = Image.new('RGB', (self.width, self.heigth), self.background_color)


    def draw(self) -> Image:
        '''画图'''
        # 创建背景设置画布
        self._create_canvas()

        if self.background_img and len(self.background_img) > 0:
            regex = re.compile(
                r'^(?:http|ftp)s?://' # http:// or https://
                r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' #domain...
                r'localhost|' #localhost...
                r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
                r'(?::\d+)?' # optional port
                r'(?:/?|[/?]\S+)$', re.IGNORECASE)
            m = re.match(regex, self.background_img)
            bg_img = None
            if m :
                resp = requests.get(self.background_img)
                _img_bytes = BytesIO()
                _img_bytes.write(resp.content)
                bg_img = Image.open(_img_bytes)
            else:
                #创建背景图片
                bg_img = Image.open(self.background_img)
            #将背景图片写入画布
            self.convas.paste(bg_img, (0,0))

        for layer in self.layers:
            if layer.get('layer_type') == 'text':
                self._draw_text(layer)
            if layer.get('layer_type') == 'image':
                self._draw_image()

        return self.convas

    def _darw_image(self, layer: dict) -> None:
        pass

    def _draw_text(self, layer: dict) -> None:
        draw = ImageDraw.Draw(self.convas)
        _font = layer.get('font')
        font = ImageFont.truetype(_font.get('font'), _font.get('size', 36))
        align = layer.get('align')
        p = tuple()
        if align and align == 'center':
            f_w, f_h = font.getsize(layer.get('text')) #获取字体大小
            p = ((self.convas.width - f_w)/2, (self.convas.height - f_h)/2)
        elif align and align == 'top-left':
            p = (0,0)
        elif align and align == 'top-right':
            f_w, f_h = font.getsize(layer.get('text')) #获取字体大小
            p = (self.convas.width - f_w, 0)
        elif align and align == 'bottom-left':
            f_w, f_h = font.getsize(layer.get('text')) #获取字体大小
            p = (0, self.convas.height - f_h)
        elif align and align == 'bottom-right':
            f_w, f_h = font.getsize(layer.get('text')) #获取字体大小
            p = (self.convas.width - f_w, self.convas.height - f_w)
        else:
            p = tuple([int(i) for i in layer.get('position','0,0').split(',')])
        color = tuple([int(i) for i in layer.get('color','0,0,0').split(',')])
        draw.text(p, layer.get('text',''), fill = color, font = font)

配置文件

配置文件相对来说比较简单,定义画布,然后定义图层,程序是在画布的基础上逐层进行绘制就ok了

config = {
    'width': 800,
    'height': 400,
    'background_img': '',
    'background_color':'42,41,55',

    'layers': [
        {
            'layer_type': 'text',
            'color': '255,0,0',
            'font': {
                'font': './font/站酷庆科黄油体.ttf',
                'size': 60,
            },
            'position': '0,0',
            'align': 'center',
            'text': 'H3BLOG(拒绝图片侵权)'
        },
        {
            'layer_type': 'text',
            'color': '255,255,255',
            'font': {
                'font': './font/站酷庆科黄油体.ttf',
                'size': 60,
            },
            'position': '',
            'align': 'top-left',
            'text': '左上'
        },
        {
            'layer_type': 'text',
            'color': '0,255,0',
            'font': {
                'font': './font/站酷庆科黄油体.ttf',
                'size': 60,
            },
            'position': '',
            'align': 'top-right',
            'text': '右上'
        },
        {
            'layer_type': 'text',
            'color': '0,0,255',
            'font': {
                'font': './font/站酷庆科黄油体.ttf',
                'size': 60,
            },
            'position': '',
            'align': 'bottom-left',
            'text': '左下'
        },
        {
            'layer_type': 'text',
            'color': '155,0,255',
            'font': {
                'font': './font/站酷庆科黄油体.ttf',
                'size': 60,
            },
            'position': '',
            'align': 'bottom-right',
            'text': '右下'
        },
    ],
}

程序执行

d = H3blogDrow()
d.parse_config(config)
img = d.draw()
img.show()

最终结果

老子用python3根据配置自动生成自定义图片logo(一键解决图片侵权困扰)