再也不怕群聊斗图了——写个脚本,一键生成 100 张自定义表情包,还能自动配上沙雕文字。
技术不一定改变世界,但一定能让你成为表情包之王。

一个尴尬的故事

有次我在群里和人斗图,对方连续甩出 5 张精准打击的表情包,而我翻遍手机只找到一张“熊猫头叹气”。
那一刻我意识到:表情包储备量,决定了社交话语权

但手动做图太慢。作为一个 Python 爱好者,我的第一反应不是去搜图库,而是:
能不能写个脚本,自动生成无限张带文字的表情包?

于是就有了下面这套“表情包军工厂”代码。
今天,我把它交给你——请理性使用,不要欺负手搓表情包的朋友。

准备工作

需要安装两个库:

pip install pillow imageio

  • Pillow:Python 最强大的图像处理库

  • imageio:用来生成 GIF(动图表情包)

另外,准备一张或几张空白表情包模板(比如熊猫头、沙雕猫、蘑菇头……可以去网上搜一套)。

功能一:给图片批量添加文字(表情包核心)

from PIL import Image, ImageDraw, ImageFont
import os

def add_text_to_image(image_path, text, output_path, font_size=40, position='bottom'):
    img = Image.open(image_path)
    draw = ImageDraw.Draw(img)
    
    # 加载字体(可以用系统自带的,或者下载一个艺术字体)
    try:
        font = ImageFont.truetype("simhei.ttf", font_size)  # 黑体
    except:
        font = ImageFont.load_default()
    
    # 文字位置:底部居中或顶部居中
    bbox = draw.textbbox((0, 0), text, font=font)
    text_width = bbox[2] - bbox[0]
    text_height = bbox[3] - bbox[1]
    width, height = img.size
    
    if position == 'bottom':
        x = (width - text_width) // 2
        y = height - text_height - 20
    else:
        x = (width - text_width) // 2
        y = 20
    
    # 添加黑色描边效果(先画阴影再画文字)
    draw.text((x-2, y-2), text, font=font, fill='black')
    draw.text((x+2, y-2), text, font=font, fill='black')
    draw.text((x-2, y+2), text, font=font, fill='black')
    draw.text((x+2, y+2), text, font=font, fill='black')
    draw.text((x, y), text, font=font, fill='white')
    
    img.save(output_path)
    print(f"已生成: {output_path}")

# 批量生成
templates = ["panda.jpg", "cat.jpg", "mushroom.jpg"]  # 你的模板列表
texts = ["我太难了", "就这?", "你有事吗", "离谱", "哈哈哈", "Python 牛逼", "摸鱼中勿扰"]

for i, template in enumerate(templates):
    for j, text in enumerate(texts):
        output = f"output/meme_{i}_{j}.png"
        add_text_to_image(template, text, output, font_size=50)

运行后,output 文件夹里多了几十张图,每一张都是表情包。从此斗图你只需要输入 meme_1_3.png,手速碾压全场。

功能二:熊猫头经典模板——自动换脸(示例)

如果你有熊猫头的空白模板(大圆脸空白),可以在指定位置贴上别人的脸。
这里简化演示:将一张人脸图片缩放到合适大小,贴到模板的圆形区域内。

from PIL import Image

def paste_face_to_panda(face_path, panda_template_path, output_path):
    panda = Image.open(panda_template_path).convert('RGBA')
    face = Image.open(face_path).convert('RGBA')
    
    # 缩放脸图
    face = face.resize((120, 120))
    
    # 创建圆形遮罩
    mask = Image.new('L', (120, 120), 0)
    mask_draw = ImageDraw.Draw(mask)
    mask_draw.ellipse((0, 0, 120, 120), fill=255)
    
    # 贴脸位置(根据你的模板手动调整偏移)
    offset = (140, 100)
    panda.paste(face, offset, mask)
    panda.save(output_path)

这样你就能把朋友的照片做成熊猫头表情包了(谨慎使用,别被打)。

功能三:生成动态表情包(GIF)

静态图不够嚣张,动图才是终极武器。
我们取一张动图模板(比如“黑人问号”的几帧),然后在每一帧上添加相同的文字。

import imageio
from PIL import Image, ImageDraw, ImageFont

def add_text_to_gif(gif_path, text, output_path):
    reader = imageio.get_reader(gif_path)
    fps = reader.get_meta_data()['fps']
    frames = []
    
    for frame in reader:
        img = Image.fromarray(frame).convert('RGBA')
        draw = ImageDraw.Draw(img)
        # 字体大小按比例
        font_size = int(img.height / 10)
        try:
            font = ImageFont.truetype("simhei.ttf", font_size)
        except:
            font = ImageFont.load_default()
        
        # 添加文字(底部居中)
        bbox = draw.textbbox((0, 0), text, font=font)
        w = bbox[2] - bbox[0]
        h = bbox[3] - bbox[1]
        x = (img.width - w) // 2
        y = img.height - h - 20
        draw.text((x, y), text, font=font, fill='white', stroke_width=2, stroke_fill='black')
        
        frames.append(img)
    
    # 保存 Gif
    imageio.mimsave(output_path, [np.array(frame) for frame in frames], fps=fps)
    print(f"动图表情包已保存: {output_path}")

注意:需要 pip install imageio 并且可能需要 pip install imageio-ffmpeg

功能四:表情包生成器 + 随机组合

把以上功能打包成一个函数,然后随机从词库里抽词、从模板库里抽图,批量自动生成几百个表情包。

import random

word_bank = [
    "加班", "改需求", "提测", "打回", "上线", "回滚",
    "Python 是最好的语言", "PHP 才是", "你说的对", "但我选择躺平"
]
template_bank = ["panda.jpg", "cat_sad.jpg", "dog_confused.jpg"]

for i in range(100):
    template = random.choice(template_bank)
    text = random.choice(word_bank) + "?" if random.random() > 0.5 else random.choice(word_bank)
    add_text_to_image(template, text, f"output/random_{i}.png")

一夜之间,你拥有了一个 100GB 的表情包库,斗图时随手丢一张,对方甚至怀疑你是人工智能。

进阶应用:自动爬取热词,生成当日热点表情包

配合爬虫抓取微博热搜或知乎热榜,自动生成当天热词的表情包,然后发到公司群里——
同事会觉得你不仅技术好,还特别紧跟时事。

import requests
from bs4 import BeautifulSoup

def get_weibo_hot():
    url = 'https://s.weibo.com/top/summary'
    headers = {'User-Agent': 'Mozilla/5.0'}
    resp = requests.get(url, headers=headers)
    soup = BeautifulSoup(resp.text, 'html.parser')
    hot_list = []
    for td in soup.select('.td-02 a')[:10]:
        hot_list.append(td.text)
    return hot_list

hot_words = get_weibo_hot()
for idx, word in enumerate(hot_words):
    add_text_to_image('template.jpg', word, f'hot_{idx}.png')

注意事项(法律 & 道德)

  • 请勿使用他人肖像制作侮辱性表情包,可能侵犯肖像权或名誉权。

  • 请勿制作包含违法内容的表情包。

  • 在公司群适度使用,避免被移出群聊。

结语

Python 能干很多事情:分析数据、训练模型、写网站。
但今天我展示的是它最“接地气”的一面——帮你快乐地摸鱼,用表情包征服群聊。

当你的同事还在手动打开美图秀秀时,你已经一键生成了 1000 张图。
当你的朋友还在问“这张图有没有字”时,你已经自动打了水印。

这,就是技术的降维打击。

现在,去下载几个空白模板,跑一下上面的代码,然后去群里炸场吧。
别忘了把成品留言给我看看——我斗图也很强,来呀。


附:如果你懒得找字体,可以用 ImageFont.load_default(),但效果比较素。推荐下载 simhei.ttf(黑体)或 arial.ttf,放到代码同目录下。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐