1. 为什么“让 Codex 生成 PSD”这件事值得单独聊
先把结论摆在前面:让 Codex 直接吐出一个能用的 PSD 文件,本身并不难,难的是很多人把提示词写成了“许愿池”,指望一句话就让模型理解图层结构、命名规范、画布尺寸、色彩模式、字体嵌入这些工程细节。我前后试过十几轮,从最开始的“帮我生成一个电商首页 PSD”,到后来能稳定产出可编辑、分层清晰、命名规整的 PSD 源文件,中间踩的坑基本都集中在提示词的信息密度和结构约束上。
这里说的 Codex,指的是那类能读写文件、执行命令、跑脚本的 AI 编程代理。它和普通聊天式 AI 最大的区别在于:它不只是“说”,它还能“做”——能创建目录、写 Python 脚本、调用库、跑命令、检查输出。所以让 Codex 生成 PSD,本质上不是让它“画”出来,而是让它写一段能生成 PSD 的代码,然后执行这段代码,最后交付一个真实的.psd文件。这个认知转变非常关键,很多人卡住就是因为一直在用“描述画面”的思路写提示词,而不是用“描述工程任务”的思路。
PSD 这种格式的特殊性也决定了这件事的门槛。它不是一张扁平图片,而是一个容器:里面有图层、图层组、蒙版、混合模式、文字图层、智能对象、通道、色彩配置文件。一个“能用”的 PSD,至少要满足几个条件——图层要分得开、名字要看得懂、文字要能改、尺寸要正确、色彩模式要匹配用途。如果只是导出一张 PNG 再改后缀成 PSD,那打开就是一张背景图,没有任何编辑价值,这种“假分层”是新手最容易交付的废品。
所以这篇内容适合三类人看:一是做设计自动化、想批量产出 PSD 模板的工程师;二是想把 AI 接进自己设计工作流的设计师;三是单纯好奇“AI 到底能不能生成可编辑设计源文件”的折腾党。我会把提示词怎么写、Codex 怎么执行、脚本怎么落地、哪些地方必踩坑,全部拆开讲清楚。核心关键词就三个:Codex、PSD、提示词,但真正决定成败的是提示词背后的工程约束。
2. 提示词的本质:不是描述画面,而是描述一份可执行的规格书
2.1 为什么“画一个好看的首页”这种提示词必然失败
我最早用的提示词大概是这样的:“用 Codex 生成一个电商首页的 PSD,风格简约,配色高级。”结果 Codex 给我的是一段 Python 代码,用 Pillow 画了几个矩形和文字,然后保存成 PSD。打开一看,所有元素挤在一个图层里,文字是像素不是文本,颜色是硬编码的 RGB,改一个字都得重新跑。这就是典型的“描述画面”式提示词带来的结果——模型只能猜,猜出来的东西没有结构。
问题的根源在于:自然语言描述画面,信息是模糊的、连续的、主观的;而 PSD 文件要求的是离散的、结构化的、精确的。你告诉它“简约高级”,它不知道是留白多还是字号小;你说“电商首页”,它不知道是 1920 宽还是 1440 宽,是 72dpi 还是 300dpi。这些空白它只能填默认值,而默认值往往和你的预期差十万八千里。
正确的思路是把提示词当成一份规格书来写。规格书的特点是:有明确的输入、明确的输出、明确的约束、明确的验收标准。你要告诉 Codex 的不是“我想要什么感觉”,而是“画布多大、分几层、每层叫什么、用什么库、文字用什么字体、颜色用什么色值、最后怎么验证”。这听起来很啰嗦,但正是这些啰嗦的细节,决定了产出是废品还是成品。
2.2 一份合格提示词的五个必备模块
我后来固定下来的提示词结构,基本包含五个模块,缺一个都会出问题。
第一个模块是任务定义。明确告诉 Codex:你要写一个 Python 脚本,用psd-tools或pytoshop或photoshop-python-api这类库,生成一个 PSD 文件,输出到指定路径。这里要特别说明“生成的是可编辑的分层 PSD,不是扁平图”,否则它很可能偷懒用 Pillow 存一个单层文件。
第二个模块是画布规格。包括宽度、高度、分辨率、色彩模式、位深度。比如“1920x1080,72dpi,RGB 色彩模式,8 位/通道”。这些参数直接决定文件能不能被 Photoshop 正常打开、能不能用于后续印刷或屏幕展示。色彩模式写错,比如该用 RGB 写成 CMYK,打开颜色会偏得离谱。
第三个模块是图层结构。这是最核心的部分。你要用树状结构描述图层和图层组的层级关系,比如“背景组包含底色层和纹理层;头部组包含 Logo 层、导航层、搜索框层;主体组包含 Banner 层、商品卡片组(每个卡片含图片层、标题层、价格层)”。层级越清晰,生成出来的 PSD 越接近可用状态。
第四个模块是元素属性。每个图层里放什么、什么颜色、什么字号、什么位置。位置最好用坐标或相对定位描述,比如“Logo 位于左上角,距左边距 40px,距顶边距 30px”。颜色用十六进制色值,字体用具体字体名,字号用像素值。这些精确信息能大幅减少模型的猜测空间。
第五个模块是验收标准。告诉 Codex 生成后要做什么检查:文件是否存在、大小是否大于某个值、图层数量是否达到预期、能否被psd-tools正常解析。这一步很多人会忽略,但它是保证产出质量的最后一道闸门。没有验收,Codex 可能给你一个 0 字节的文件还说“已完成”。
2.3 提示词里必须写死的几个“反偷懒”约束
除了上面五个模块,我还会额外加几条硬约束,专门对付模型的偷懒倾向。
第一条:禁止使用 Pillow 的Image.save直接存 PSD。Pillow 确实支持保存 PSD,但它保存的是单层扁平图,没有图层结构。必须明确要求使用支持图层写入的库,比如pytoshop可以手动构建图层,或者用photoshop-python-api通过 COM 接口驱动 Photoshop 生成。
第二条:文字必须是可编辑文本图层,不能是像素。这一点在纯 Python 库里很难做到,因为大多数开源库对文本图层的支持很弱。如果确实需要可编辑文字,最稳的方案是让 Codex 生成一个.jsx脚本,通过 Photoshop 的脚本接口执行,这样文字、智能对象、图层样式都能保留。
第三条:图层命名必须用英文或拼音,不能有特殊字符。PSD 对图层名的字符集有一定限制,中文名在某些库写入时会乱码,特殊字符如/、:、*会直接导致写入失败。这条约束能避免很多莫名其妙的报错。
第四条:必须输出生成日志。要求 Codex 在脚本里打印每一步的执行结果,比如“已创建背景层”“已创建头部组”“文件已保存到 xxx”。这样出问题时你能快速定位是哪一步挂了,而不是面对一个黑盒干瞪眼。
3. 从提示词到 PSD:Codex 实际执行链路拆解
3.1 第一步:让 Codex 选对技术路线
Codex 拿到提示词后,第一件事是决定用什么技术方案。这里有三条主流路线,各有优劣,提示词里最好直接指定,否则它会随机选一条,结果可能不符合你的环境。
| 技术路线 | 核心库/工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 纯 Python 库写入 | pytoshop、psd-tools | 无需安装 Photoshop,跨平台,可自动化 | 文本图层支持弱,图层样式有限 | 批量生成简单分层模板 |
| Photoshop 脚本驱动 | photoshop-python-api + JSX | 支持全部 PSD 特性,文字可编辑 | 依赖本机 Photoshop,Windows/macOS 差异大 | 高质量设计源文件 |
| 混合方案 | Python 生成结构 + JSX 补细节 | 兼顾自动化与质量 | 链路长,调试复杂 | 复杂项目、需要精细控制 |
我的经验是:如果只是要一个分层清晰、用于展示或二次开发的 PSD,纯 Python 库就够了;如果要求文字可改、样式完整、能直接交付设计师,那必须走 Photoshop 脚本路线。提示词里要写清楚你的环境——有没有装 Photoshop、是 Windows 还是 macOS、Python 版本多少,这些信息直接影响 Codex 的选型。
3.2 第二步:环境准备中最容易被忽略的三个细节
Codex 开始写代码之前,会先检查环境。这一步有三个坑,我几乎每次都要提醒它。
第一个坑是库版本冲突。psd-tools和pytoshop对 Pillow 的版本要求不一样,同时装可能打架。提示词里最好指定“使用虚拟环境,先pip install pytoshop,如果失败则回退到psd-tools”。让 Codex 自己处理依赖冲突,比你自己事后修要省事。
第二个坑是Photoshop 的 COM 接口权限。在 Windows 上,photoshop-python-api通过 COM 调用 Photoshop,如果 Photoshop 没有以管理员权限运行,或者安全设置里禁用了 COM 自动化,脚本会直接报“无法连接到 Photoshop”。这个错误信息很隐晦,新手容易以为是代码问题。提示词里可以加一句“如果 COM 连接失败,先检查 Photoshop 是否已启动并允许自动化”。
第三个坑是文件路径的编码问题。PSD 文件路径如果包含中文或空格,某些库写入时会失败。最稳的做法是让 Codex 把输出路径设成纯英文、无空格的临时目录,生成成功后再移动到目标位置。这个细节看起来小,但能省掉大量排查时间。
3.3 第三步:脚本生成后的自检与修复循环
Codex 写完脚本、跑完第一次之后,不要急着验收。我通常会要求它做一轮自检,具体包括:用psd-tools重新打开生成的 PSD,打印图层树;检查文件大小是否合理(一个 1920x1080 的分层 PSD 通常至少几百 KB,如果只有几 KB 说明图层没写进去);检查图层数量是否和提示词里描述的一致。
如果自检失败,就进入修复循环。这里有个技巧:不要让它盲目重跑,而是要求它先打印错误堆栈,定位到具体是哪一行、哪个库、哪个参数出的问题,再针对性修改。我遇到过最常见的问题是pytoshop写入文本图层时字体参数格式不对,报错信息是“invalid font descriptor”,解决方法是把字体名从“Microsoft YaHei”改成“Arial”先跑通,再逐步替换。
这个自检加修复的循环,通常要跑两到三轮才能稳定。提示词里可以预先写一句“如果第一次生成失败,请分析错误原因并修复,最多重试三次”,这样 Codex 会自动进入调试模式,而不是失败一次就停在那里。
4. 提示词模板实战:一份可以直接抄的完整示例
4.1 模板全文与逐段说明
下面这份模板是我目前用得最顺手的,针对“生成一个电商首页分层 PSD”的场景。你可以直接改参数复用。
任务:写一个 Python 脚本,生成一个可编辑的分层 PSD 文件,输出到 ./output/homepage.psd。 画布规格: - 宽度 1920px,高度 1080px - 分辨率 72dpi - 色彩模式 RGB,8 位/通道 - 背景透明 图层结构(从下到上): 1. 背景组 background - bg_color:纯色填充 #F5F5F5 - bg_texture:叠加一层 10% 透明度的噪点纹理 2. 头部组 header - logo:文字图层,内容 "SHOP",字体 Arial Bold,字号 32px,颜色 #333333,位置 (40, 30) - nav:文字图层,内容 "首页 新品 促销 关于",字体 Arial,字号 16px,颜色 #666666,位置 (400, 40) - search:矩形图层,尺寸 300x40,圆角 20px,填充 #FFFFFF,边框 #DDDDDD,位置 (1500, 30) 3. 主体组 main - banner:矩形图层,尺寸 1840x400,填充 #E8E8E8,位置 (40, 100) - product_grid:包含 4 个商品卡片组,每个卡片含: - card_bg:矩形 440x300,填充 #FFFFFF,位置依次为 (40, 540), (520, 540), (1000, 540), (1480, 540) - product_img:矩形 400x200,填充 #CCCCCC,位于卡片内居中偏上 - product_title:文字图层,内容 "商品名称",字体 Arial,字号 18px,颜色 #333333 - product_price:文字图层,内容 "¥199",字体 Arial Bold,字号 24px,颜色 #FF4444 技术要求: - 使用 pytoshop 库写入图层,禁止用 Pillow 直接保存 PSD - 图层名用英文,禁止特殊字符 - 文字图层如果库不支持,先用矩形占位并在日志中标注 - 每创建一个图层打印一行日志 - 生成后用 psd-tools 重新打开,打印图层树验证 验收标准: - 文件存在且大小 > 100KB - 图层数量 >= 15 - psd-tools 能正常解析,无异常 - 如果失败,分析错误并修复,最多重试 3 次这份模板的关键在于:它把“感觉”全部翻译成了“参数”。位置用坐标,颜色用色值,字体用具体名称,尺寸用像素。Codex 拿到这样的提示词,基本不需要猜,直接照着写代码就行。
4.2 参数调整时的注意事项
改这份模板的时候,有几个地方要特别小心。
画布尺寸和图层坐标要联动。如果你把宽度从 1920 改成 1440,那所有 x 坐标超过 1440 的图层都会跑到画布外面。最稳的做法是让 Codex 用相对定位,比如“距右边距 40px”,而不是绝对坐标。但相对定位对库的要求更高,简单场景下还是手动算好坐标更可靠。
色彩模式要和用途匹配。屏幕展示用 RGB,印刷用 CMYK。但大多数 Python 库对 CMYK 的支持很差,写入后颜色可能完全不对。如果确实需要 CMYK,建议走 Photoshop 脚本路线,让 Photoshop 自己做色彩转换。
字体要选系统里真实存在的。提示词里写“Microsoft YaHei”,但你的运行环境是 Linux 服务器,没有这个字体,生成出来要么报错要么回退到默认字体。最稳的做法是先让 Codex 检查系统字体列表,或者直接用 Arial、Helvetica 这类跨平台字体。
4.3 生成后的验证清单
脚本跑完之后,别急着说“成了”。我通常会按这个清单过一遍:
- 用 Photoshop 或在线 PSD 查看器打开,确认图层树和预期一致
- 逐个点击图层,确认能选中、能隐藏、能改透明度
- 如果是文字图层,双击确认能编辑文字内容
- 检查画布尺寸和色彩模式是否正确
- 检查文件大小是否在合理范围
- 用
psd-tools命令行工具再解析一次,确认无警告
这套验证下来,基本能过滤掉 90% 的“假成功”。剩下的 10% 通常是细节问题,比如某个图层位置偏了几像素,或者颜色差了一点点,这些可以在后续迭代中微调。
5. 踩坑实录:那些让 PSD 生成失败的典型问题
5.1 图层写入成功但打开是空白
这是最让人抓狂的问题:脚本没报错,文件也生成了,大小也正常,但用 Photoshop 打开就是一片空白。我排查了整整一个下午,最后发现是图层可见性标志没设置。某些库在创建图层时,默认visible属性是False,需要显式设为True。这个默认值在不同库、不同版本里还不一样,pytoshop早期版本就有这个坑。
解决办法是在提示词里加一句“每个图层创建后显式设置 visible=True”,或者在脚本里统一加一个后处理步骤,遍历所有图层把可见性打开。这个坑的隐蔽性在于:它不报错,只是默默给你一个空文件,新手很容易以为是库坏了。
5.2 文字图层变成乱码或方块
文字图层是 PSD 生成里最难搞的部分。纯 Python 库写入文字时,需要提供字体描述符、编码方式、字形信息,任何一个不对都会导致乱码。我遇到过三种典型情况:一是中文显示成方块,原因是字体不支持中文或编码没设对;二是文字位置偏移,原因是基线计算方式和 Photoshop 不一致;三是文字根本不可编辑,原因是写入时被转成了像素。
最稳的解决方案是走 Photoshop 脚本路线。让 Codex 生成一个.jsx文件,里面用app.activeDocument.artLayers.add()创建文字图层,设置kind = LayerKind.TEXT,然后通过textItem.contents设置内容。这样生成的文字图层和手动在 Photoshop 里打的一模一样,完全可编辑。代价是必须装 Photoshop,而且执行速度比纯 Python 慢不少。
5.3 文件能打开但图层顺序全乱
图层顺序错乱通常是因为库的图层堆叠逻辑和 Photoshop 不一致。有的库是“先创建的在下”,有的是“先创建的在上”,还有的按字母顺序排。如果不显式控制,生成出来的图层顺序可能和你预期的完全相反。
解决办法是在提示词里明确“图层按从下到上的顺序创建”,并在脚本里用索引控制插入位置。更稳妥的做法是生成后用一个排序步骤,按图层名或预设的优先级重新排列。这个坑在图层多的时候特别明显,少的时候不容易发现。
5.4 大尺寸文件生成超时或内存溢出
1920x1080 的 PSD 还好,但如果做到 4K 甚至更大,纯 Python 库可能会吃光内存。我试过生成一个 8000x6000 的分层 PSD,脚本跑到一半直接被系统 kill 掉。原因是某些库会把所有图层数据先加载到内存再统一写入,尺寸一大就爆。
应对策略有两个:一是分块生成,先写背景和底层,保存后再追加图层;二是改用 Photoshop 脚本路线,让 Photoshop 自己管理内存。如果必须用 Python,可以在提示词里要求“使用流式写入,避免一次性加载所有图层数据”,但支持这个特性的库不多,实际效果有限。
6. 进阶玩法:把 PSD 生成接进自动化工作流
6.1 批量生成不同尺寸的适配版本
一旦单次生成跑通,批量就是水到渠成的事。我现在的做法是:把提示词里的画布尺寸和图层坐标参数化,用一个 JSON 配置文件管理不同尺寸的规格,然后让 Codex 写一个循环,读取配置、逐个生成、逐个验证。比如同一套首页设计,要输出 1920、1440、750 三个宽度版本,只需要在配置里改尺寸和对应的坐标缩放比例。
这里有个细节要注意:坐标缩放不能简单按比例乘,因为字体大小、圆角半径、边距这些在小尺寸下需要单独调整。我的做法是在配置里为每个尺寸单独写一套完整参数,而不是用缩放系数。虽然配置量大一点,但生成出来的效果更可控。
6.2 用模板 PSD 做增量修改
从零生成 PSD 适合做新模板,但如果只是改改文字、换换颜色,更高效的方式是基于已有 PSD 做增量修改。psd-tools支持读取现有 PSD、修改图层属性、再保存。你可以让 Codex 写一个脚本,打开模板文件,定位到指定图层,改文字内容或填充色,然后另存为新文件。
这个玩法的价值在于:设计规范、图层结构、样式细节都保留在模板里,AI 只负责改数据,不负责重建结构。这样既保证了质量稳定,又大幅提升了速度。我目前维护着十几套模板 PSD,日常的批量出图基本都走这条路。
6.3 和设计系统对接的思路
再往上一层,是把 PSD 生成和设计系统打通。设计系统里定义了颜色变量、字体规范、间距规则,这些数据可以直接喂给 Codex 作为生成参数。比如设计系统里定义“主色 #FF4444、圆角 8px、基础字号 16px”,提示词里就不用写死这些值,而是引用变量名,让 Codex 从设计系统的配置文件里读取。
这样做的好处是:设计规范一改,所有生成的 PSD 自动跟着变,不需要逐个改提示词。实现上需要一个中间层,把设计系统的 token 转换成 Codex 能理解的参数格式。这个中间层可以用简单的 JSON 映射,也可以用更复杂的 DSL,看你的团队规模和使用频率。
7. 我个人的几条实操心得
第一,提示词的长度和产出质量基本成正比。我最早用的提示词不到 50 字,产出基本不能用;后来加到 500 字,能用但需要大量手动修;现在稳定在 800 到 1500 字,基本一次成型。不要怕提示词长,怕的是信息不够。
第二,先跑通最小闭环,再逐步加复杂度。不要一上来就要求 20 个图层、5 个图层组、文字可编辑、样式完整。先用 3 个图层跑通“生成-验证-打开”的闭环,确认链路没问题,再往上加。这样出问题时容易定位,不会一锅粥。
第三,把每次成功的提示词存下来。我现在有一个提示词库,按场景分类:电商首页、详情页、海报、Banner、App 界面。每次新需求先翻库,找到最接近的改一改,比从零写快得多。提示词工程本质上是个积累活,写得越多,手感越准。
第四,不要迷信“一句话生成”。那些演示里一句话生成精美 PSD 的,要么是精心调过的提示词,要么是后期手动修过的。真实工作流里,提示词加调试加验证,才是常态。接受这一点,心态会稳很多。
第五,验证环节不能省。我见过太多人脚本跑完看到文件生成了就以为成了,结果交付时打开是空的。花两分钟做验证,能省掉两小时的返工。验证清单可以固定下来,每次照着过一遍,形成肌肉记忆。
最后说一句关于工具选择的体会:如果你的环境里能装 Photoshop,优先走脚本路线,质量和可控性都高一个档次;如果只能跑纯 Python,那就接受文本图层和复杂样式的限制,把精力放在图层结构和命名规范上,先把“能用的分层文件”做出来,再逐步优化细节。PSD 生成这件事,难的不是技术,是耐心和对细节的把控。