最终效果
为什么会写这个帖子
因为表情包API最近挂的好频繁,还不如自己画呢
抛砖引玉的根本目的是引玉!
实在不会做,你可以留下你画的表情包图片!!(想法也行)
咳咳以下正文
下载插件模板并做好基础配置就不教了,只说明图片制作的部分
准备
首先,你需要准备一张图片,自己画的或者网上找一个
这张图是我做示例的图片,我将他命名为捅.png
,保存在根目录/data/images/
文件夹内
从图片上应该很明显能看出我的意图,将两个人的QQ头像放入两个脑袋的位置
因此,两个脑袋的位置最好是抠空的(我这个是自己画的所以本来就空的)
当然,不是空的也没事,就是可能美观度差点
python代码
获取图片
获取某QQ号的头像,这里使用腾讯API进行获取
import requests
from io import BytesIO
qq1 = "744561141"
url = "http://q.qlogo.cn/headimg_dl?dst_uin="+qq1+"&spec=640&img_type=jpg"
response = requests.get(url)
img1 = Image.open(BytesIO(response.content))
通过这段代码可以获取我QQ的头像,并保存到img1变量中
我们通过同样的方法获得第二个QQ头像,保存到img2
读取捅.png作为背景图
img = Image.open('data/images/捅.png')
此时你会发现,头像图片过大需要修改尺寸
我这张表情的话图片在74左右比较合适
在制作的时候可以自行调整
img1 = img1.resize((74, 74))
img2 = img2.resize((74, 74))
至此,我们的三张图片准备完毕
绘制头像
需要引入一个新的库,并创建与捅.png
相同大小的画布
注意此处的(255, 255, 255)
是RGB颜色,你可以修改
from PIL import Image, ImageDraw, ImageFont
img_with_border = Image.new('RGB', img.size, (255, 255, 255))
如果你进行过电脑绘图或者ps就会知道,在上层的图片会盖住底下的图片
我们最先绘制的图片就是在底层
为了让两个头像是穿过两个脑袋洞显示,我们需要先绘制QQ头像
imgfinish.paste(img1, (85, 31))
imgfinish.paste(img2, (38, 48))
我们创建了一个名为imgfinish
的图像,并绘制上两个QQ头像
此处的(85, 31)
和(38, 48)
是两个图片放置的位置
(我是提前量好的,实际在这里可能需要慢慢调整)
此时的效果是这样的
也许你已经发现了一些bug,不过先继续后续的代码
绘制背景图
也许你会直接使用imgfinish.paste(img, (0, 0))
,但你会发现,绘制之后透明的部分没有被保留
这是因为我们还需要为它创建遮罩,以保留透明部分,而这个遮罩就是这张图片本身
imgfinish.paste(img, (0, 0), img)
裁剪头像
现在的效果已经基本完美了,但仍然有问题,就是前面的头像对后面的头像进行了遮挡
这很正常,因为前面的头像是方的
解决方法也很简单,只要把前面的头像裁成圆的好了
于是就有了以下代码
mask = Image.new("L", img2.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, img2.size[0], img2.size[1]), fill=255)
我们也要同时修改绘制img2
的时候的代码
imgfinish.paste(img2, (38, 48), mask)
现在就已经完成了
保存图片
imgfinish.save('data/images/捅2.png')
这样我们就保存了一张新的表情
Q&A
为什么要保存在data/images/
文件夹
因为[CQ:image,file=捅2.png]
可以直接调用,不需要再去改目录