带文字海报流程自动化

上一篇文章: juejin.cn/post/736349...

项目代码整理在:

github.com/liangwq/Cha...

添加图片注释,不超过 140 字(可选)

根据用户的输入生成图片prompt模块代码封装:

ini 复制代码
from openai import OpenAI 

import json
def json_parse(image_prompt):
    image_prompt = image_prompt.replace("```\n","")
    image_prompt = image_prompt.replace("\n```","")
    # 您提供的字符串
    data_str =image_prompt #completion.choices[0].message.content


    # 将字符串转换为JSON对象
    try:
        data_json = json.loads(data_str)
        return data_json
    except json.JSONDecodeError as e:
        print("字符串不是有效的JSON格式:", e)
        
def gen_text_to_image_prompt(user_input): 
    client = OpenAI(api_key="你的阶跃APIkey", base_url="https://api.stepfun.com/v1")

    completion = client.chat.completions.create(
      model="step-1-200k",
      messages=[
          {
              "role": "system",
              "content": "你是由阶跃星辰提供的带文字海报生成助手,你擅长中文,英文,以及多种其他语言的对话。在保证用户数据安全的前提下,你能对用户的问题和请求,作出快速和精准的回答。同时,你的回答和建议应该拒绝黄赌毒,暴力恐怖主义的内容",
          },
          {"role": "user", "content": "你是带文本海报生成智能助理. \
                                       1.根据用户输入内容生成做图需要的描述prompt \
                                       2.描述图片详细具体内容 \
                                       3.描述图片风格、颜色分布、光影效果、纹理、材质\
                                       4.给出图片具体尺寸、比例 \
                                       5.适合的配文,按行分句放到list里\
                                       6.输出英文结果\
                                       7.json格式输出生成结果:{\
                                                  "prompt":"把上面文本生成图描述+具体信息描述+风格颜色光影纹理材质描述汇总到prompt",\
                                                   "text":"适合用户输入场景的配文",\
                                                   "ar":"图片长:宽比,数字:数字",\
                                                   "hw":"图长宽具体尺寸",\
                                                   "X":"文字所在坐标位置值X,\
                                                   "Y":"文字所在坐标位置值Y,\
                                                   "is_vertical":"文字排版是否竖排"}"},
          {"role": "user", "content":user_input},
      ],
    )
    out_put_chinese = completion.choices[0].message.content
    completion = client.chat.completions.create(
      model="step-1-200k",
      messages=[
          {
              "role": "system",
              "content": "你是由阶跃星辰提供的带文字海报生成助手,你擅长中文,英文,以及多种其他语言的对话。在保证用户数据安全的前提下,你能对用户的问题和请求,作出快速和精准的回答。同时,你的回答和建议应该拒绝黄赌毒,暴力恐怖主义的内容",
          },
          {"role": "user", "content": out_put_chinese +"\n把上面中文输出翻译成英文,无关信息不要过多输出" },

      ],
    )
    out_put = completion.choices[0].message.content
    print(out_put)
    out_put = json_parse(out_put)
    return out_put

图片生成模块封装,根据上面生成的prompt调用图片生成后台服务生成图片。

ini 复制代码
from gradio_client import Client
def image_generation(image_prompt,ip_url):
    client = Client(ip_url)
    image_prompt = image_prompt["prompt"] + " --ar " + image_prompt["ar"]
    out_data = client.predict(image_prompt,"dpm-solver",14,4.5,0,True)
    # 图片地址
    image_path = out_data[0]
    return image_path

根据用户输入生成prompt中抽取出文字排版的信息对文字排版。

arduino 复制代码
def auto_text_layout(inputext=[], x=0,y=0,row_spacing=100, col_spacing=80, vertical=True, font="SimSun", color=(255, 255, 255, 0)):
    if vertical:
        output=[] 
        y0=y
        for text in inputext:
            for char in list(text):
                output.append({
                    "content": char,
                    "position": (x, y),
                    "font": font,
                    "color": color
                })
                y +=   col_spacing
            y= y0
            x += row_spacing
    else:
        output=[]
        x0 = x
        for text in inputext:
            for char in list(text):
                output.append({
                    "content": char,
                    "position": (x, y),
                    "font": font,
                    "color": color
                })
                x += row_spacing
            x=x0
            y += col_spacing
    return output

根据生成图片,排版好的文字合成海报模块。

ini 复制代码
import os
import json
from PIL import Image, ImageDraw, ImageFont
import cv2

def text_image_blender_poster(image_url,auto_text,font_path ,font_size,output_dir,out_file_name):
    # 设置海报模板路径、文字内容、输出目录等参数
    template_path = image_url  # 海报模板路径

    text_lines = auto_text
    output_dir = output_dir  # 输出目录
    font_path =  font_path # 字体文件路径
    font_size = font_size  # 字体大小

    # 确保输出目录存在
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 加载模板图片
    template_image = Image.open(template_path)

    # 创建一个可以在Pillow中使用的字体对象
    font = ImageFont.truetype(font_path, font_size)

    # 创建一个可以在Pillow中使用的绘图对象
    draw = ImageDraw.Draw(template_image)

    # 在指定位置添加文字
    for line in text_lines:
        draw.text(line['position'], line['content'], font=font, fill=line['color'])

    # 保存处理后的图片
    output_path = os.path.join(output_dir, 'poster_with_multiple_lines.jpg')
    template_image.save(output_path)

    # 如果需要进行图层融合和模糊处理,可以使用OpenCV
    # 读取处理后的图片
    image = cv2.imread(output_path)

    # 这里可以添加OpenCV的图层融合和模糊处理代码
    # 例如,使用高斯模糊
    blurred_image = cv2.GaussianBlur(image, (5, 5), 0)

    # 保存模糊处理后的图片
    cv2.imwrite(os.path.join(output_dir, out_file_name), blurred_image)

    print("海报生成和处理完成。")

生成海报是否合格验证模块。

python 复制代码
from dashscope import MultiModalConversation
import dashscope
dashscope.api_key ='把你申请的qwenvl api-key放这边'
def call_with_local_file(local_file_path):
    """Sample of use local file.
       linux&mac file schema: file:///home/images/test.png
       windows file schema: file://D:/images/abc.png
    """
    local_file_path1 = local_file_path#'file:///Users/**/output_posters/poster_with_multiple_lines.jpg'

    messages = [{
        'role': 'system',
        'content': [{
            'text': 'You are a helpful assistant.'
        }]
    }, {
        'role':
        'user',
        'content': [
            {
                'image': local_file_path1
            },
            {
                'text': '请描述这张图,这张图中文字放置的位置合理吗?符合审美需求吗?\
                        1.如果合理请回复是,并给出合理原因\
                        2.如果不合理给出理由和建议\
                        3.如果有建议请给出文字合适放置的坐标位置\
                        4.如果不合理给出字体大小建议\
                        5.如果不合理给出字体颜色建议\
                        6.json格式输出回答结果'
            },
        ]
    }]
    response = MultiModalConversation.call(model=MultiModalConversation.Models.qwen_vl_chat_v1, messages=messages)
    print(response)

把上面的模块串接成自动化流程。

ini 复制代码
#根据用户输入生成图片生成prompt
image_prompt = gen_text_to_image_prompt("5.1劳动节")

#根据ptompt生成图
ip_url ="http://0.0.0.0:6006"
image_url = image_generation(image_prompt,ip_url)

#文字排版
text_lines = image_prompt["text"]
vertical = False if image_prompt["is_vertical"]=='false' else True
x =  float(image_prompt["X"])
y =  float(image_prompt["Y"])
auto_text=auto_text_layout(inputext=text_lines, x=x,y=y,row_spacing=48, col_spacing=63, vertical=False, font="SimSun", color=(255, 255, 255, 0))
print(auto_text)

#根据生成图片+排版文字合成海报
image_url =image_url
auto_text = auto_text
font_size = 42
output_dir = 'output_posters'
font_path="/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
out_file_name = 'blurred_poster.jpg'
text_image_blender_poster(image_url,auto_text,font_path ,font_size,output_dir,out_file_name)

#生成海报是否合格验证模块
local_file_path ='file://'+'/Users/**/output_posters/poster_with_multiple_lines.jpg'
call_with_local_file(local_file_path)

小结:

上面代码实现,根据把海报生成的各模块做了封装,并利用封装了自动化流程。让这条海报生成模块可以根据用户一键生成期待的海报,这只是一个基本流程封装,用户可以根据自己的需要调整每个模块实现,让生成海报符合自己需要。

现在流程只允许用户输入文字描述生成海报,大家如果感兴趣可以对这条链路改造。允许用户输入参考的图,生成类似的海报;允许用户给出参考图,文字创意包生成指定约束的海报...

相关推荐
sp_fyf_202437 分钟前
【大语言模型】ACL2024论文-35 WAV2GLOSS:从语音生成插值注解文本
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·数据挖掘
AITIME论道38 分钟前
论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
人工智能·深度学习·学习·机器学习·语言模型
明明真系叻2 小时前
第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题
人工智能·笔记·深度学习·机器学习·1024程序员节
88号技师3 小时前
2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
人工智能·算法·matlab·优化算法
IT猿手3 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab
88号技师3 小时前
几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
2301_764441333 小时前
基于python语音启动电脑应用程序
人工智能·语音识别
HyperAI超神经4 小时前
未来具身智能的触觉革命!TactEdge传感器让机器人具备精细触觉感知,实现织物缺陷检测、灵巧操作控制
人工智能·深度学习·机器人·触觉传感器·中国地质大学·机器人智能感知·具身触觉
galileo20164 小时前
转化为MarkDown
人工智能
我要学编程(ಥ_ಥ)4 小时前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先