软件构造大作业——儿童故事插图生成模块的设计与实现
软件构造大作业——儿童故事插图生成模块的设计与实现
一、模块背景与功能定位
在儿童故事管理平台中,故事文本生成完成后,若仅以文字形式呈现,难以满足儿童用户的阅读体验需求。因此,本模块在已有故事生成服务的基础上,引入 AI 文生图能力,实现根据故事内容自动生成插图,并将插图结果与故事数据进行关联存储与展示。
本模块作为独立服务存在,与故事生成模块解耦,仅依赖 Story 数据模型提供的故事信息。
二、整体架构与流程设计
插图生成模块的整体处理流程如下:
- 根据 story_id 查询故事标题或正文
- 构造文生图提示词
- 调用文生图 API 生成图片
- 将图片保存至服务器本地目录
- 将图片路径与 story_id 关联写入数据库
三、数据库表结构设计
为支持一篇故事对应多张插图,设计独立的插图表:
CREATE TABLE story_image (
id INT PRIMARY KEY AUTO_INCREMENT,
story_id INT NOT NULL,
image_url VARCHAR(255) NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (story_id) REFERENCES story(id)
);
该表仅负责插图资源的存储与关联,不存储图片本身。
四、故事信息获取实现
在生成插图前,需要从数据库中获取故事信息:
def get_story_by_id(db_conn, story_id: int):
sql = "SELECT title, content FROM story WHERE id = %s"
cursor = db_conn.cursor(dictionary=True)
cursor.execute(sql, (story_id,))
return cursor.fetchone()
此方法仅返回生成插图所需的必要字段,避免多余数据加载。
五、文生图 API 调用实现
以下示例展示了插图生成服务的完整实现流程(以伪 API 为例):
import requests
def call_image_api(prompt: str) -> bytes:
payload = {
"prompt": prompt,
"size": "512x512"
}
response = requests.post(
"https://api.example.com/generate-image",
json=payload,
timeout=60
)
response.raise_for_status()
return response.content
通过统一封装 API 调用逻辑,方便后续更换模型服务。
六、图片文件存储实现
import os
import uuid
IMAGE_DIR = "static/img"
def save_image(image_bytes: bytes) -> str:
if not os.path.exists(IMAGE_DIR):
os.makedirs(IMAGE_DIR)
filename = f"{uuid.uuid4().hex}.png"
file_path = os.path.join(IMAGE_DIR, filename)
with open(file_path, "wb") as f:
f.write(image_bytes)
return f"img/{filename}"
该方法返回统一的相对路径,供数据库和前端使用。
七、插图数据写入数据库
def save_story_image(db_conn, story_id: int, image_url: str):
sql = """
INSERT INTO story_image (story_id, image_url)
VALUES (%s, %s)
"""
cursor = db_conn.cursor()
cursor.execute(sql, (story_id, image_url))
db_conn.commit()
八、小结
本模块实现了从故事内容获取、插图生成、文件存储到数据库关联的完整流程,为儿童故事平台提供了视觉增强能力,并保持了良好的模块解耦结构。

浙公网安备 33010602011771号