☰
Python+Pillow表情包生成器:从命令行到Flask Web服务
2026/10/2 4:06:29 网站建设 项目流程

最近在折腾趣味小工具时,遇到了一个很常见的需求:给图片加上顶部和底部的文字,快速生成一张“XX过来”风格的表情包。网上在线生成器虽然多,但普遍有水印、限尺寸、字体效果也未必符合预期,最关键的是没法批量处理。于是我自己用 Python + Pillow 写了一个简单的表情包生成器,既能本地命令行直接跑,也可以改造成 Flask Web 服务,让朋友直接上传图片生成。这篇文章就把完整实现思路、代码和踩坑过程整理出来,适合想练习 Python 图像处理,或者想做一个小工具落地的同学参考。

为了便于描述,我把项目代号定为“DC-meme-generator”,目录名就叫meme-generator,演示用的默认文字就用“八神过来”,具体含义不重要,大家拿到代码后可以随意替换成自己的梗。

1. 项目背景与需求分析

1.1 需求拆解

表情包生成器不算复杂,但核心需求非常明确:用户提供一张图片,程序在图片上方和下方分别绘制一段文字,文字通常使用白色字体加黑色描边,背景可以加半透明黑条,整体效果类似经典的上文下图 meme 风格。

如果只是用画图工具手动加文字,效率太低,而且每张图的文字位置、字体大小都要反复调整。用代码来做这件事,好处是可以把“图片加载、文字渲染、图片保存”这几个步骤固化下来,后续只要换图片和文字,就能一键生成结果。

从功能上看,这个项目可以拆成几个模块:

  • 图片读取模块:支持 jpg、png、webp 等常见格式。
  • 文字渲染模块:负责计算文字尺寸、自动居中、描边、换行。
  • 画布合成模块:在半透明背景条上绘制文字,再叠加到原图上。
  • 命令行入口:通过参数指定图片、文字、字体、输出路径。
  • 批量生成模块:读取 JSON 配置,一次处理多张图片。
  • Web 访问模块:用 Flask 提供上传页面和生成接口。

1.2 技术选型

Python 生态里做图像处理,最常用的是 Pillow。它是 PIL 的图像处理库分支,API 稳定、文档丰富,适合处理图片缩放、裁剪、合成、绘制文字这类任务。

选择 Pillow 而不是 OpenCV,主要原因是:表情包生成的核心操作是“文字绘制”和“图层叠加”,Pillow 的ImageDraw模块天然支持字体加载、文字测量和描边,代码量更少,理解成本更低。OpenCV 的优势在图像识别、特征提取等场景,如果后续要做人脸自动定位、表情识别,再引入 OpenCV 也不迟。

Web 端我选了 Flask,因为它轻量、简单,适合快速把本地工具改造成在线服务。如果你更熟悉 Django 或 FastAPI,也可以按同样的思路迁移。

1.3 功能清单

第一版计划实现这些功能:

  • 给任意图片添加顶部和底部文字。
  • 文字自动居中,支持自定义字体大小。
  • 支持中文字体,解决中文乱码问题。
  • 支持半透明黑色背景条,提升文字可读性。
  • 支持批量生成,通过 JSON 配置批量处理。
  • 提供一个简易 Web 页面,上传图片在线生成。

2. 环境准备与版本说明

2.1 运行环境

本文示例以 Python 环境为主,建议使用 Python 3.8 及以上版本。Pillow 版本建议不低于 8.0,因为代码中用到ImageDraw.textbbox和stroke_width参数,这两个功能在较老版本中可能不完整。

Flask 是可选依赖,只在 Web 版用到。如果你只需要命令行工具,可以不安装。

版本要求整理如下:

依赖版本建议说明
Python3.8+示例代码使用 f-string 等语法
Pillow8.0+文字测量、描边功能依赖
Flask3.x可选,Web 版才需要

2.2 创建虚拟环境

为了避免依赖冲突,建议用虚拟环境隔离项目依赖:

mkdir meme-generator cd meme-generator python -m venv venv

Windows 下激活虚拟环境:

venv\Scripts\activate

Linux / macOS 下激活虚拟环境:

source venv/bin/activate

激活后安装依赖:

pip install --upgrade pip pip install Pillow pip install Flask

安装完成后,可以用下面的命令验证 Pillow 是否可用:

python -c "from PIL import Image; print(Image.__version__)"

如果能正常输出版本号,说明环境已经准备好。

2.3 中文字体准备

这是一个非常关键的准备工作。Pillow 默认字体不支持中文,直接绘制中文会显示成方框“□□□”。解决思路是指定一个支持中文的字体文件,常见选择有:

  • Windows 系统自带simhei.ttf(黑体)、simsun.ttc(宋体)。
  • Noto Sans CJK SC,开源字体,跨平台通用。
  • 阿里巴巴普惠体、思源黑体等开源字体。

在项目目录下创建一个resources文件夹,把字体文件放进去:

meme-generator/ ├── resources/ │ └── simhei.ttf ├── meme.py ├── batch_meme.py └── web_app.py

不同操作系统的字体路径不一样,最好的做法是把字体文件复制到项目目录中,通过相对路径引用,避免依赖系统字体路径。

2.4 项目结构规划

项目文件结构规划如下:

meme-generator/ ├── resources/ │ └── simhei.ttf ├── meme_generator/ │ └── meme.py ├── templates/ │ └── index.html ├── uploads/ ├── outputs/ ├── batch_meme.py └── web_app.py

meme_generator/meme.py放核心生成逻辑,batch_meme.py放批量脚本,web_app.py放 Flask 服务。这样把核心逻辑和入口程序分离,代码结构更清晰,后面扩展也更方便。

3. 核心原理:如何把文字画到图片上

3.1 Pillow 图像处理基本概念

Pillow 处理表情包生成,核心涉及三个类:

  • Image:表示一张图片,负责读取、保存、尺寸调整。
  • ImageDraw:在图片上绘制线条、矩形、文本。
  • ImageFont:加载字体文件,定义文字样式。

基本操作是先打开图片,再获取绘图对象:

from PIL import Image, ImageDraw image = Image.open("input.jpg") draw = ImageDraw.Draw(image)

之后所有绘制操作都会直接作用在这张图片上。需要注意的是,如果需要保留透明通道,有一种做法是先把图片转换为RGBA模式,绘制完成后再转回RGB保存,这样可以减少透明背景带来的意外问题。

3.2 文字测量与居中

要让文字在图片上居中,必须先知道文字的实际尺寸。旧版本 Pillow 常用draw.textsize测量,但该方法在较新版本中已不建议使用。更推荐的做法是用textbbox获取文字的边界框:

font = ImageFont.truetype("resources/simhei.ttf", 48) bbox = draw.textbbox((0, 0), "八神过来", font=font) text_width = bbox[2] - bbox[0] text_height = bbox[3] - bbox[1]

textbbox返回的是一个四元组(left, top, right, bottom),表示文字所占的矩形区域。用右下角减左上角就得到文字宽高。

文字居中公式很简单:

image_width, image_height = image.size x = (image_width - text_width) // 2 y = (image_height - text_height) // 2

实际项目中,如果顶部文字同时还要有背景条,那么文字的位置需要根据背景条的位置动态计算,而不是简单地在整张图中间。

3.3 文字描边与半透明底条

meme 图最经典的风格是白字黑边。Pillow 的draw.text方法支持stroke_width和stroke_fill参数:

draw.text( (x, y), "八神过来", font=font, fill="white", stroke_width=3, stroke_fill="black" )

stroke_width表示描边宽度,stroke_fill表示描边颜色。这样就不需要自己画多层的文字偏移来实现描边效果。

半透明底条的实现需要用到图层的概念。直接修改原图的像素区域会破坏原图内容,正确做法是新建一张透明图层,在图层上绘制半透明矩形,再用Image.alpha_composite把图层和原图合成:

overlay = Image.new("RGBA", image.size, (0, 0, 0, 0)) overlay_draw = ImageDraw.Draw(overlay) overlay_draw.rectangle([0, 0, image_width, band_height], fill=(0, 0, 0, 180)) image = Image.alpha_composite(image, overlay)

这里颜色元组(0, 0, 0, 180)中,前三位是 RGB,第四位是透明度,取值范围 0 到 255。数值越小越透明,180 是比较常见的半透明效果,既能看清文字,又不会完全遮住图片。

3.4 多行文字与自动换行

如果文字很长,需要自动换行。Python 标准库中的textwrap模块可以按宽度切分文字,再逐行绘制:

import textwrap lines = textwrap.wrap(text, width=12) for idx, line in enumerate(lines): line_y = base_y + idx * line_height draw.text((x, line_y), line, font=font, fill="white", stroke_width=3, stroke_fill="black")

textwrap.wrap按字符数切分,适合中文场景。如果是英文文本,可以结合 Pillow 的draw.textlength来判断是否超出图片宽度,实现更精确的按像素换行。

4. 实战:命令行版表情包生成器

4.1 创建项目目录与依赖文件

按照前面的规划创建目录:

mkdir -p meme-generator/resources mkdir -p meme-generator/meme_generator mkdir -p meme-generator/templates mkdir -p meme-generator/uploads mkdir -p meme-generator/outputs

把字体文件放到resources目录下,然后开始写核心代码。

4.2 编写核心类 MemeGenerator

核心生成逻辑统一放在一个类中,方便复用和测试。

# 文件路径:meme_generator/meme.py from PIL import Image, ImageDraw, ImageFont class MemeGenerator: def __init__(self, font_path, font_size=48): self.font_path = font_path self.font_size = font_size self.image = None def load(self, image_path): self.image = Image.open(image_path).convert("RGBA") return self def add_text_band(self, text, position="top"): if not text: return self width, height = self.image.size font = ImageFont.truetype(self.font_path, self.font_size) draw = ImageDraw.Draw(self.image) bbox = draw.textbbox((0, 0), text, font=font) text_width = bbox[2] - bbox[0] text_height = bbox[3] - bbox[1] padding = 20 band_height = text_height + padding * 2 overlay = Image.new("RGBA", self.image.size, (0, 0, 0, 0)) overlay_draw = ImageDraw.Draw(overlay) if position == "top": band_region = (0, 0, width, band_height) text_x = (width - text_width) // 2 text_y = padding - bbox[1] else: band_region = (0, height - band_height, width, height) text_x = (width - text_width) // 2 text_y = height - band_height + padding - bbox[1] overlay_draw.rectangle(band_region, fill=(0, 0, 0, 180)) self.image = Image.alpha_composite(self.image, overlay) draw = ImageDraw.Draw(self.image) draw.text( (text_x, text_y), text, font=font, fill="white", stroke_width=3, stroke_fill="black" ) return self def save(self, output_path): self.image.convert("RGB").save(output_path)

这段代码的核心逻辑是:先计算文字尺寸和背景条高度,接着在透明图层上绘制半透明黑色矩形,然后与原图合成,最后在原图上绘制带描边的文字。

构造函数接收字体文件和字体大小两个参数;load方法负责打开图片并转为RGBA模式;add_text_band方法支持top和bottom两个位置;save方法在保存时把图片转回RGB,避免 JPEG 格式不支持透明度导致保存报错。

4.3 编写命令行入口

接下来写一个命令行入口,让用户通过参数指定图片和文字。

# 文件路径:meme.py import argparse from meme_generator.meme import MemeGenerator def main(): parser = argparse.ArgumentParser(description="表情包生成器") parser.add_argument("image", help="输入图片路径") parser.add_argument("--top", default="", help="顶部文字") parser.add_argument("--bottom", default="", help="底部文字") parser.add_argument("--font", default="resources/simhei.ttf", help="字体文件路径") parser.add_argument("--size", type=int, default=48, help="字体大小") parser.add_argument("-o", "--output", default="output.png", help="输出图片路径") args = parser.parse_args() generator = MemeGenerator(font_path=args.font, font_size=args.size) generator.load(args.image) generator.add_text_band(args.top, position="top") generator.add_text_band(args.bottom, position="bottom") generator.save(args.output) print(f"表情包已生成:{args.output}") if __name__ == "__main__": main()

argparse是 Python 标准库,适合写简单命令行工具。这里把图片路径设置为必需参数,文字、字体、字号、输出路径都设为可选参数,并提供了默认值。

4.4 运行与验证

准备一张测试图片test.jpg,执行:

python meme.py test.jpg --top "八神过来" --bottom "经典meme生成器" -o result.png

预期结果是:图片上方出现“八神过来”,下方出现“经典meme生成器”,文字为白字黑边、半透明黑底。

如果执行成功,控制台会输出:

表情包已生成:result.png

打开生成的图片,如果文字位置正确、中文没有乱码,说明核心功能已经跑通。

5. 进阶:批量生成与模板化配置

5.1 使用 JSON 配置批量任务

命令行一次只能处理一张图。实际使用中,我们可能面临这样的需求:有一批图片模板,每张图需要配上不同的文字,一次性全部生成。

解决方案是把批量任务写进 JSON 配置,程序逐条读取并处理。

创建config/batch.json:

[ { "image": "templates/dc1.jpg", "top": "八神", "bottom": "过来", "output": "outputs/meme1.png" }, { "image": "templates/dc2.jpg", "top": "震惊", "bottom": "这也行", "output": "outputs/meme2.png" }, { "image": "templates/dc3.jpg", "top": "我就说嘛", "bottom": "果然如此", "output": "outputs/meme3.png" } ]

字段含义很容易理解:image是输入图片路径,top和bottom是文字内容,output是输出路径。

5.2 实现批量生成脚本

编写batch_meme.py:

# 文件路径:batch_meme.py import json import os import sys from meme_generator.meme import MemeGenerator def main(): if len(sys.argv) < 2: print("用法:python batch_meme.py config/batch.json") sys.exit(1) config_path = sys.argv[1] with open(config_path, "r", encoding="utf-8") as f: tasks = json.load(f) font_path = "resources/simhei.ttf" for task in tasks: image_path = task["image"] top_text = task.get("top", "") bottom_text = task.get("bottom", "") output_path = task.get("output", "output.png") os.makedirs(os.path.dirname(output_path), exist_ok=True) generator = MemeGenerator(font_path=font_path, font_size=48) generator.load(image_path) generator.add_text_band(top_text, position="top") generator.add_text_band(bottom_text, position="bottom") generator.save(output_path) print(f"已生成:{output_path}") if __name__ == "__main__": main()

批量脚本的主逻辑是遍历 JSON 中的每个任务,逐个调用MemeGenerator生成表情包。这里用task.get("top", "")的原因是为了兼容某些任务不需要顶部或底部文字的情况,避免KeyError。

运行方式:

python batch_meme.py config/batch.json

有了批量能力之后,无论是给社交内容配图,还是做一系列趣味表情包,效率都会高很多。

5.3 给文字条增加多行支持

上一版的add_text_band只支持单行文字。如果文字太长,会直接超出图片边界。我们可以引入textwrap模块,让文字自动换行。

改造后的add_text_band如下:

import textwrap def add_text_band(self, text, position="top", max_chars=12): if not text: return self width, height = self.image.size font = ImageFont.truetype(self.font_path, self.font_size) draw = ImageDraw.Draw(self.image) lines = textwrap.wrap(text, width=max_chars) line_bbox = draw.textbbox((0, 0), "测", font=font) line_height = line_bbox[3] - line_bbox[1] total_text_height = line_height * len(lines) padding = 20 band_height = total_text_height + padding * 2 overlay = Image.new("RGBA", self.image.size, (0, 0, 0, 0)) overlay_draw = ImageDraw.Draw(overlay) if position == "top": band_region = (0, 0, width, band_height) base_y = padding else: band_region = (0, height - band_height, width, height) base_y = height - band_height + padding overlay_draw.rectangle(band_region, fill=(0, 0, 0, 180)) self.image = Image.alpha_composite(self.image, overlay) draw = ImageDraw.Draw(self.image) for idx, line in enumerate(lines): bbox = draw.textbbox((0, 0), line, font=font) line_width = bbox[2] - bbox[0] text_x = (width - line_width) // 2 text_y = base_y + idx * line_height - bbox[1] draw.text( (text_x, text_y), line, font=font, fill="white", stroke_width=3, stroke_fill="black" ) return self

这里用textwrap.wrap(text, width=max_chars)按字符数切分,然后逐行计算宽度并居中。中文一个字符通常接近一个正方形,按字符数切分的效果已经足够好。如果是纯英文长文本,更严谨的做法是用draw.textlength逐字判断是否超出图片宽度,这里不再展开。

6. 扩展:基于 Flask 的在线表情包生成器

6.1 Web 端需求

命令行版虽然好用,但对不懂命令行的朋友来说上手成本还是偏高。更好的方案是做一个简单的 Web 页面:用户上传图片,填写顶部和底部文字,点击按钮就能在线生成并下载表情包。

Flask 本身非常轻量,我们用很少的代码就能把核心生成逻辑暴露成 Web 接口。

6.2 页面与接口

先写一个最简单的首页模板。

<!-- 文件路径:templates/index.html --> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>表情包生成器</title> </head> <body> <h2>在线表情包生成器</h2> <form method="post" enctype="multipart/form-data"> <p>图片:<input type="file" name="image" accept="image/*" required></p> <p>顶部文字:<input type="text" name="top" placeholder="例如:八神"></p> <p>底部文字:<input type="text" name="bottom" placeholder="例如:过来"></p> <button type="submit">生成表情包</button> </form> </body> </html>

表单通过multipart/form-data上传文件,name="image"对应 Flask 端读取文件时用的字段名。

接着写 Flask 应用:

# 文件路径:web_app.py import os import uuid from flask import Flask, render_template, request, send_file from meme_generator.meme import MemeGenerator app = Flask(__name__) UPLOAD_FOLDER = "uploads" OUTPUT_FOLDER = "outputs" FONT_PATH = "resources/simhei.ttf" os.makedirs(UPLOAD_FOLDER, exist_ok=True) os.makedirs(OUTPUT_FOLDER, exist_ok=True) ALLOWED_EXTENSIONS = {"png", "jpg", "jpeg", "webp", "bmp"} def allowed_file(filename): return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS @app.route("/", methods=["GET", "POST"]) def index(): if request.method == "POST": file = request.files.get("image") top_text = request.form.get("top", "") bottom_text = request.form.get("bottom", "") if not file or file.filename == "": return "请先选择图片" if not allowed_file(file.filename): return "不支持的图片格式" ext = file.filename.rsplit(".", 1)[1].lower() unique_name = uuid.uuid4().hex + "." + ext input_path = os.path.join(UPLOAD_FOLDER, unique_name) file.save(input_path) output_name = "meme_" + unique_name output_path = os.path.join(OUTPUT_FOLDER, output_name) generator = MemeGenerator(font_path=FONT_PATH, font_size=48) generator.load(input_path) generator.add_text_band(top_text, position="top") generator.add_text_band(bottom_text, position="bottom") generator.save(output_path) return send_file(output_path, as_attachment=True) return render_template("index.html") if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True)

这里有几个细节值得注意:

  • 使用uuid.uuid4().hex生成随机文件名,避免多用户上传同名文件互相覆盖。
  • 上传前校验扩展名,只允许常见图片格式,减少了非法文件上传的风险。
  • send_file(output_path, as_attachment=True)让浏览器直接下载生成后的表情包。

启动服务:

python web_app.py

浏览器访问http://127.0.0.1:5000,上传图片并输入文字,点击生成即可下载表情包。

6.3 结果输出与安全提示

Web 版虽然方便,但有两个点需要特别提醒。

第一,当前实现把文件保存到了本地磁盘,生产环境建议使用云存储或者对象存储,避免本地磁盘无限增长。第二,上传接口需要额外限制文件大小,否则大文件可能导致服务器内存和磁盘被耗尽。Flask 可以通过配置MAX_CONTENT_LENGTH来限制请求体大小:

app.config["MAX_CONTENT_LENGTH"] = 5 * 1024 * 1024 # 限制 5MB

超出限制时请求会返回 413 状态码,可以在错误处理中捕获并给出友好提示。

7. 常见问题与排查思路

7.1 中文显示为方框

问题现象:生成的图片中,中文全部显示为方框或乱码。

常见原因:Pillow 使用的字体文件不支持中文。

解决思路:检查代码中的字体路径,换成支持中文的字体文件,比如simhei.ttf或 Noto Sans CJK SC。在命令行版本中,可以显式指定字体路径:

python meme.py test.jpg --top "八神过来" --font resources/simhei.ttf

7.2 文字超出图片边界

问题现象:文字过长时,右侧或底部被截断。

常见原因:没有做文字换行处理。

解决思路:使用textwrap按字符数切分,或者用draw.textlength动态判断文字宽度,超出图片宽度时自动缩小字号或换行。

7.3 保存后透明区域变黑或丢失

问题现象:png 图片处理后保存为 jpg,透明区域变成了黑色。

常见原因:JPEG 格式不支持透明度,RGB 通道中透明像素通常被渲染为黑色。

解决思路:如果原图有透明背景,建议保存为 PNG 格式。处理逻辑中在保存前调用convert("RGB")是为了兼容 JPEG,如果输出路径是.png,可以保留RGBA模式。

7.4 Pillow 安装失败

问题现象:执行pip install Pillow时出现编译错误。

常见原因:本地 Python 版本较低,或缺少编译工具。

解决思路:先升级 pip,再尝试安装:

pip install --upgrade pip pip install Pillow

如果仍然失败,可以考虑下载对应平台的预编译 wheel 包。

7.5 批量处理时内存占用过高

问题现象:批量处理大量高清图片时,程序内存占用持续上升。

常见原因:每次读取图片后没有释放资源,或者图片本身分辨率过大。

解决思路:在load方法中先检查图片尺寸,对超大图片进行缩放。批量任务中使用生成器逐条处理,不要一次把所有任务加载到内存。

常见问题整理成表格如下:

问题现象常见原因解决思路
中文显示方框字体不支持中文更换中文字体
文字被截断没有自动换行引入 textwrap 换行
透明区域变黑JPEG 不支持透明度输出 PNG 或转 RGB 后保存
Pillow 安装失败环境缺少工具升级 pip、安装预编译包
批量内存过高图片过大图片压缩、逐条处理

8. 最佳实践与工程建议

8.1 资源文件管理

字体文件属于项目资源,不建议散落在根目录。统一放在resources目录下,代码中通过相对路径引用。需要打包成桌面应用或部署到服务器时,只需要带上resources目录即可。

如果是团队协作,还可以把字体文件放到对象存储或公司内部源,避免每台机器都手动拷贝。

8.2 参数校验与异常处理

在实际工程中,不能假设用户一定会传合法参数。比如图片路径不存在、字体文件缺失、输出目录没有写入权限,这些都要在代码中做异常处理。

建议在load方法中增加文件存在性判断:

import os def load(self, image_path): if not os.path.exists(image_path): raise FileNotFoundError(f"图片不存在:{image_path}") self.image = Image.open(image_path).convert("RGBA") return self

同理,在add_text_band中也要判断字体文件是否存在,否则运行时才发现问题会很难排查。

8.3 性能优化与批量任务

处理图片本身就是 CPU 密集型任务。如果是本地小批量生成,单线程足够。如果每天要生成几千张图,建议考虑:

  • 使用多进程或线程池并行处理,Pillow 的Image对象在不同进程中独立加载,可以显著提升吞吐量。
  • 输入图片统一压缩到合理分辨率,比如最长边 1024 像素,表情包场景完全够用。
  • 输出使用高质量的 JPEG 或 PNG 格式,控制文件大小以方便传输。

批量任务中的重试机制也很重要。某些图片可能因为编码问题打不开,捕获异常后记录日志,跳过当前任务继续处理后面的任务,避免一个坏文件拖垮整批任务。

8.4 版权与合规提醒

表情包生成器本身是一个技术练习工具,但使用时要特别注意合规问题。

  • 不要使用未经授权的商业图片进行二次创作和传播。
  • 不要在表情包中使用他人肖像进行侮辱、丑化或恶意传播。
  • 批量生成的用途如果涉及商业盈利,需要确认素材版权。
  • 在线服务上线后,建议在页面声明“图片素材版权归原权利人所有,请勿上传侵权内容”。

合规问题虽然不是代码逻辑,但却是工程师需要具备的基本意识。

9. 总结与下一步

这篇文章从需求分析出发,完整实现了一个 Python 表情包生成器:先是基于 Pillow 写出了命令行版本,实现了图片加载、半透明底条、白色文字黑色描边等核心效果;然后扩展出了 JSON 批量生成能力和基于 Flask 的在线生成页面;最后整理了常见的乱码、越界、内存占用等问题。

通过这个小项目,你可以掌握 Pillow 的文字测量、图层合成、字体渲染等基础操作,也能理解命令行工具和 Web 工具之间如何复用同一套核心逻辑。这个思路同样适用于其他图像处理小工具,比如加水印、自动九宫格切图、简单海报合成等。

下一步可以考虑这些扩展方向:

  • 结合人脸识别库,自动把文字放在不遮挡人脸的位置。
  • 接入 AI 文案生成接口,根据图片内容自动生成文字。
  • 把 Flask 服务部署到云服务器,做成一个完整的在线表情包网站。

我自己后续打算给它加一个模板管理功能,把常用表情包的布局、字体颜色、默认文字都存成配置,这样新加一个模板只需要写一段配置,不用改代码。如果你也有更好玩的模板思路,欢迎参照本文代码自己扩展试试。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询