
我是AI时代的无业游民我游荡在现实与意念之间AI生成的海报为什么大部分看起来那么糟过去一年我陆续帮三个团队处理过AI 生成活动海报的需求。结果高度一致第一版生成出来所有人沉默三秒然后有人说要不还是找设计师吧。问题不在于模型画得不好。当前的图像生成模型在单张图的质感、光影、构图能力上早已超过多数非专业设计师。真正的问题是海报是一个受约束的设计问题而大多数人把它当成了自由创作问题在提问。背景与痛点为什么能画图不等于能出海报一张活动海报有硬约束主标题必须可读、日期地点必须准确、视觉重心必须落在标题上、配色必须符合品牌调性、留白必须为文字服务。这些约束之间还互相牵制——标题太长会挤压留白留白不足会让文字压在复杂背景上变得不可读。直接用一句 prompt 让模型生成一张科技感活动海报模型会优先满足科技感这个审美目标而把文字区域、可读性、信息层级全部交给随机性。于是你得到一张很好看的图但上面要么是乱码文字要么根本没有放标题的地方。不解决这个问题的代价很具体团队要么放弃 AI 回到人工设计失去效率要么硬用生成图然后被参会者吐槽这海报上的字看不清失去专业度。两者都是隐性成本。方案设计把生成降级为合成核心思路的转变是不要让模型负责整张海报让它只负责背景层文字和布局由确定性代码完成。这个决策有三个备选方案我逐一说明为什么放弃方案做法放弃理由纯 prompt 生成整图一句话生成含文字的完整海报文字必乱不可控无法迭代生成图 后期 P 字生成背景人工在 PS 里加字无法批量化回到人工流程图生图 局部重绘用 inpainting 修文字区每次改动都要重绘成本高且不稳定分层合成模型出背景代码出文字层采用分层合成的关键认知是文字渲染是确定性任务不该交给概率模型。字体、字号、行距、对齐、安全边距这些用代码表达是精确的用 prompt 表达是碰运气。把不确定的部分视觉氛围交给模型把确定的部分信息传达交给代码这是唯一能同时保证好看和能用的分工。代价是你需要控制背景图的文字友好度——即背景在文字区域必须有足够的对比度和低复杂度。这需要在 prompt 层面就约束而不是事后补救。核心实现约束背景生成给模型划定禁区不要描述整张图而是描述文字区域之外的部分。实践中我用一个构图模板把画布按 16:9 划分上方 40% 为标题区下方 25% 为信息区中间留给视觉主体。PROMPT_TEMPLATE Abstract {style} background for an event poster. Composition: the upper 40% must be visually calm — low contrast, smooth gradient, no busy details, suitable for overlaying large text. The lower 25% must also be calm for small text. The central band may contain the main visual interest. Color palette: {palette}. No text, no letters, no numbers, no logos. 这里的关键是 “low contrast, smooth gradient” 这类功能性描述而不是审美描述。模型对平静、低对比的理解足够可靠能显著降低文字区被复杂纹理污染的概率。用代码合成文字层确定性布局合成层用 Pillow 或 Canvas 都行核心是建立一套与背景无关的布局系统。下面是一个可复用的排版函数defcompose_poster(bg_path,title,meta,out_path):bgImage.open(bg_path).convert(RGB)W,Hbg.size drawImageDraw.Draw(bg)# 标题区上部 40%左右各留 8% 安全边距title_box(int(W*0.08),int(H*0.10),int(W*0.92),int(H*0.45))title_fontfit_font(title,title_box,max_sizeint(H*0.12))# 信息区下部 25%meta_box(int(W*0.08),int(H*0.72),int(W*0.92),int(H*0.92))meta_fontfit_font(meta,meta_box,max_sizeint(H*0.035))draw_text_block(draw,title,title_box,title_font,anchortop)draw_text_block(draw,meta,meta_box,meta_font,anchorbottom)bg.save(out_path)fit_font是核心它二分搜索一个字号使文字在给定 box 内不溢出。这是纯 prompt 方案永远做不到的——模型不会告诉你这个标题在这个字号下会溢出。文字可读性兜底动态遮罩即使背景在文字区足够平静也不能保证任何配色下都可读。加一层自适应遮罩defensure_contrast(bg,box,text_color(255,255,255)):regionbg.crop(box).convert(L)meanImageStat.Stat(region).mean[0]ifmean140:# 背景偏亮白字会糊overlayImage.new(RGBA,bg.size,(0,0,0,0))dImageDraw.Draw(overlay)d.rectangle(box,fill(0,0,0,90))# 半透明黑bgImage.alpha_composite(bg.convert(RGBA),overlay).convert(RGB)returnbg这个兜底逻辑看起来粗糙但它是可解释、可调试的当海报出问题时你知道是 mean 阈值的问题而不是模型今天心情不好。效果验证我用同一批 20 个活动信息长短标题混合、中英文混合做了对比纯 prompt 方案文字可读率约 15%标题溢出率 60%平均返工 4.2 次。分层合成方案文字可读率 100%遮罩兜底保证标题溢出率 0%fit_font 保证平均返工 0.8 次主要是背景风格不满意重生成即可。复现步骤很简单取任意一张生成背景跑一遍compose_poster然后故意用一个 30 字的超长标题观察fit_font是否自动缩小字号而不是溢出。这是验证布局系统是否健壮的最小测试。值得注意的是背景生成的质量仍然决定最终观感上限。分层合成解决的是能用不解决惊艳。所以背景 prompt 的迭代仍然是必要的只是它不再承担文字必须正确这个它本来就不擅长的责任。边界与演进这套方案不适用于需要文字与图形深度融合的设计比如文字本身构成视觉主体、需要复杂排版多栏、图文环绕的场景。这些情况下分层合成的背景文字二元结构会显得生硬仍然需要专业设计工具。演进方向有两个。一是背景生成与布局的反馈闭环把文字层的安全边距信息回传给背景生成让模型知道哪些区域会被文字覆盖从而主动避开。当前主流图像模型已支持基于区域掩码的条件生成这条路是通的。二是模板化把常见的海报版式标题居中、标题左对齐、双栏固化成模板用户只填内容进一步降低对 prompt 的依赖。真正要记住的判断是AI 生成内容的质量取决于你是否把任务拆解到了模型擅长的粒度。海报这个任务模型擅长氛围不擅长信息传达。把两者分开问题就解决了一大半。