前两天我的朋友肖和我说 “完啦完啦,现在微信公众号没法弄了”。我就纳闷了,问她怎么回事。她告诉我 “黑洞图片事件你不知道,好多微信公众号号都有被告图片侵权,赔偿还不少。虽然我一直注意,但是有些图片根本不知道有没有版权啊。自己的小号,被告了可赔偿啊不起。” 我本来想告诉她,你想多了,就你那破号,但是这样怕是没法做朋友了。机智的我转说她 “太简单了,我帮你做个图片小程序吧,自动生成图片,一劳永逸”。肖立马说 “好啊,好啊,到时候赚钱了分你!” 于是就有了黑洞微信头图生成器。
使用 Pillow 处理图片
Pillow 是python的图片处理库,可以用来处理图片。核心代码大概如下:
from PIL import Image, ImageDraw, ImageFont ... # 生成图片 image = Image.new("RGBA", (WIDTH, HEIGHT), background_color) draw = ImageDraw.Draw(image) # 设置字体大小 font = ImageFont.truetype(font_name, 20) w, h = font.getsize(word) # 文字垂直和水平居中 draw.text(((WIDTH - w) / 2, (HEIGHT - h) / 2), word, fill=font_color, font=font) # 生成图片文件 image.save("output/{}_{}.png".format(filename, idx, "png"))
核心功能都是使用 Pillow 提供的api,生成一个rgb图片,然后往上贴文本,步骤和Photoshop创建图片类似。创建的图片效果有:
英文会生成10种,中文生成4种。更多效果图,请见github/game404
使用 click 封装cli
python的命令行工具有 docopt
, fire
和 click
。 比较了一下,觉得 click
更适合本项目。
@click.command(context_settings=CONTEXT_SETTINGS) @click.option("--word", prompt="the word", help="图片文字") @click.option("--bcolor", default="white", help="图片背景色,默认白色,支持颜色值['red', 'cyan', 'green', ...]及rgb hex值#ffffff") @click.option("--fcolor", default="#2496ed", help="文字颜色,默认docker蓝,支持颜色值['red', 'cyan', 'green', ...]及rgb hex值#ffffff") @click.option("--fpath", default=None, help="字体文件路径,默认空,使用预制字体。也许相对路径更合适。") def generator(word, bcolor, fcolor, fpath): """ 黑洞图片生成器,协助生成微信公众号头图。自由不侵权,game404 出品。 python运行示例: python blackhole.py --word docker python blackhole.py --word docker --bcolor black --fcolor #ffffff python blackhole.py --word docker --fpath some.ttf Docker运行示例: docker run -it --rm game404/blackhole docker ... """
运行效果如下:
(pywork-Y7-meC5z) C:\pywork\blackhole>python blackhole.py --help Usage: blackhole.py [OPTIONS] 黑洞图片生成器,协助生成微信公众号头图。自由不侵权,game404 出品。 python运行示例: python blackhole.py --word docker python blackhole.py --word docker --bcolor black --fcolor #ffffff python blackhole.py --word docker --fpath some.ttf Docker运行示例: docker run -it --rm game404/blackhole docker ... Options: --word TEXT 图片文字 --bcolor TEXT 图片背景色,默认白色,支持颜色值['red', 'cyan', 'green', ...]及rgb hex值#ffffff --fcolor TEXT 文字颜色,默认docker蓝,支持颜色值['red', 'cyan', 'green', ...]及rgb hex值#ffffff --fpath TEXT 字体文件路径,默认空,使用预制字体。也许相对路径更合适。 -h, --help Show this message and exit.
做完程序,我正在想怎么发给肖,封装成pypi package呢,还是exe呢。 这时候旁边的肖恩顿,突然插了一句。“直接编成docker镜像吧,多方便啊,还跨平台”。原来他都知道啊,希望分帐的消息他不知道。
应用docker镜像制作
Dockerfile
如下:
FROM python:3.7-alpine3.9 LABEL maintainer="shawn <studyoo@foxmail.com>" WORKDIR /app COPY requirements.txt /app RUN apk add --no-cache jpeg-dev \ zlib-dev \ freetype-dev \ lcms2-dev \ openjpeg-dev \ tiff-dev \ tk-dev \ tcl-dev \ harfbuzz-dev \ fribidi-dev \ gcc \ musl-dev \ && echo "[global] \ index-url = http://pypi.tuna.tsinghua/simple \ trusted-host = pypi.tuna.tsinghua \ timeout = 120 \ " > /etc/pip.conf \ && pip install --upgrade pip \ && pip install -r requirements.txt \ && mkdir output COPY . /app ENTRYPOINT ["python","blackhole.py"]
pillow涉及的dev包比较多,属于比较难装的package。
封装完成后,提交到docker hub,肖直接可以使用:
docker run -it -v $PWD/output:/app/output --rm game404/blackhole --word docker
和python方式运行类似,区别在于只用输入--word docker
参数
总结
简单总结一下:
- 使用pillow制作图片文件。
- 使用click封装代码命令行工具。
- 编写docker镜像方便使用。