☰
用Codex生成PSD文件:提示词编写与Python脚本实战
2026/9/28 15:22:56 网站建设 项目流程

1. 先搞清楚"让Codex生成PSD"到底在说什么

很多人第一次听到"用Codex直接生成PSD"这个说法,脑子里冒出来的画面是:敲一行提示词,AI啪一下吐出一个能双击打开、图层齐全、文字还能编辑的Photoshop文件。如果你也是这么理解的,那我得先泼一盆冷水——Codex本身不产出二进制PSD文件,它产出的是"能生成PSD的代码"。这个区别听起来像文字游戏,但它是整件事能不能落地的分水岭。

我先把结论摆在这儿:所谓"让Codex生成PSD",本质上是让Codex帮你写一段脚本,这段脚本调用图像处理库(比如Python生态里的psd-tools、pytoshop,或者干脆用Pillow配合图层合成逻辑),把结构化的图层数据写成一个.psd文件。Codex在这里扮演的角色是"代码生成器",不是"文件生成器"。你给它清晰的图层结构描述,它给你可运行的Python脚本,脚本跑完,PSD就躺在你的输出目录里了。

那为什么标题说"提示词其实很简单"?因为真正复杂的部分不在提示词,而在你对PSD结构的描述是否精确。提示词只是把这些描述翻译成代码的桥梁。很多人卡住,不是因为不会写提示词,而是因为自己都没想清楚"这个PSD里到底要有哪些图层、每个图层的混合模式是什么、文字图层用什么字体"。

这篇文章适合谁看:一是做设计自动化、想批量产出PSD模板的从业者;二是想用AI辅助生成图像工程代码的开发者;三是好奇"AI编程到底能碰多深的文件格式"的技术爱好者。我会从PSD的文件结构讲起,拆解提示词该怎么写,给出可直接复现的脚本,再聊聊实测中那些文档里不会写的坑。

提示:本文讨论的是"用代码生成PSD文件"这一技术路径,不涉及任何图像生成模型的直接出图能力。两者是互补关系,不是替代关系。

2. PSD不是普通图片,它的结构决定了提示词怎么写

2.1 PSD的文件本质:一个带图层树的容器

要理解为什么提示词需要"精确描述结构",得先知道PSD文件里装了什么。PSD是Adobe Photoshop的专有格式,它的核心不是像素,而是图层(Layer)。一个PSD文件内部大致包含这几层信息:

  • 文件头:记录版本、通道数、宽高、位深、颜色模式。
  • 颜色模式数据:RGB、CMYK、灰度等模式下的原始图像数据。
  • 图像资源块:缩略图、分辨率信息、切片等元数据。
  • 图层与蒙版信息:这是最关键的部分,包含每个图层的名称、位置、不透明度、混合模式、可见性、图层组嵌套关系。
  • 图像数据:每个图层的实际像素通道数据,通常经过RLE压缩。

你可以把PSD想象成一个"文件夹压缩包":文件夹里有若干子文件夹(图层组),每个子文件夹里放着图片(图层像素),还有一个清单(图层属性)记录每个文件夹的名字和排列顺序。Codex要生成的代码,就是按照这个清单去"组装"压缩包。

2.2 为什么不能直接让AI"画"出PSD

有人会问:既然现在图像生成模型这么强,为什么不直接让它输出PSD?原因有两个。第一,主流图像生成模型输出的是扁平位图(PNG、JPG),它们没有"图层"这个概念,生成结果是一张压平的图,你没法单独移动某个元素。第二,PSD的图层数据需要精确的坐标、尺寸、混合模式,这些是结构化数据,不是像素分布能表达的。

所以正确的分工是:图像生成模型负责"每个图层长什么样",Codex负责"把这些图层按正确结构组装成PSD"。这就是为什么提示词的重点不在"画什么",而在"怎么组织"。

2.3 提示词里必须出现的四类信息

基于上面的结构分析,一条能用的提示词至少要包含这四类信息,缺一类Codex就会开始"猜",而它猜的结果往往不是你想要的:

信息类别具体内容缺失后果
画布参数宽高、分辨率、颜色模式、位深生成的PSD尺寸错误或打不开
图层清单图层名称、类型(像素/文字/形状)、顺序图层缺失或顺序混乱
图层属性位置坐标、不透明度、混合模式、可见性图层叠放效果错误
输出要求文件路径、库选型、异常处理脚本跑不通或输出位置不明

我实测下来,只要这四类信息齐全,哪怕提示词写得很口语化,Codex也能给出可运行的脚本。反过来,如果你只写"帮我生成一个海报PSD",它给你的代码大概率是跑不通的——因为它不知道海报多大、有几个图层、每个图层放哪。

3. 提示词的实际写法:从一句话到可运行脚本

3.1 一个最小可用的提示词模板

先看一个我常用的最小模板,你可以直接改参数用:

用Python写一个脚本,使用psd-tools或pytoshop库生成一个PSD文件。 画布:宽1080,高1920,RGB模式,8位深,分辨率72。 图层从下到上依次为: 1. 背景层,纯色填充 #1A1A2E,不透明度100%,正常混合模式 2. 主标题文字层,内容"限时活动",字体思源黑体,字号120,颜色#FFFFFF,位置居中偏上 3. 副标题文字层,内容"立即参与",字号48,颜色#FFD700,位于主标题下方80像素 4. 装饰形状层,一个半径200的圆形,填充#E94560,位于右下角 输出到 ./output/poster.psd,如果目录不存在就创建。

这条提示词大概150字,信息密度很高。Codex拿到之后,会去查psd-tools的API,然后生成一段创建图层、设置属性、保存文件的代码。实测下来,这类提示词的一次通过率在70%左右,剩下的30%通常是库的API细节需要微调。

3.2 为什么"图层从下到上"这个顺序必须说清楚

这是新手最容易忽略的点。PSD的图层顺序直接决定视觉叠放效果,而不同库对"添加顺序"的处理逻辑不一样。有的库是"先添加的在最底层",有的是"先添加的在最顶层"。如果你不明确说"从下到上",Codex可能按它自己的理解来,结果就是背景层盖住了文字层,打开一看一片纯色。

我的做法是:永远在提示词里显式声明顺序方向,并且用"第1层在最底、第N层在最顶"这种无歧义的表述。这比说"按视觉顺序"要可靠得多,因为"视觉顺序"在不同人脑子里方向是反的。

3.3 文字图层是重灾区,字体信息要给全

文字图层在PSD里不是简单的"画几个字",它需要记录字体名称、字号、字重、行距、字距、对齐方式、颜色。如果提示词里只写"加一个标题",Codex生成的代码可能只画了像素文字,打开PSD后你发现文字不能编辑——因为它被栅格化了。

要生成可编辑的文字图层,提示词里必须包含"文字图层"这个关键词,并且给出字体名称。这里有个现实问题:psd-tools对文字图层的写入支持有限,很多时候需要借助pytoshop或者直接操作PSD的底层结构。我在实测中发现,如果目标是"文字可编辑",用pytoshop的成功率更高;如果只是要"看起来像文字",用Pillow画上去再作为像素图层嵌入更稳。

注意:不同库对文字图层的支持差异很大,提示词里最好指定库,否则Codex可能选一个不支持文字图层的库,导致你拿到的PSD文字全是像素。

3.4 混合模式和透明度的表达要具体

"叠加""正片叠底""滤色"这些混合模式,在代码里对应的是枚举值。提示词里用中文说"正片叠底",Codex一般能映射到multiply,但如果你说"让它看起来亮一点",它就懵了。所以涉及混合模式,直接用标准名称,或者干脆写英文枚举名。

透明度同理,写"半透明"不如写"不透明度50%"。我见过有人写"稍微透明一点",结果Codex给了个80%,跟预期差很远。能量化的参数绝不模糊描述,这是提示词工程里最朴素也最有效的原则。

4. 实测脚本拆解:从提示词到PSD的完整链路

4.1 环境准备与库选型

在跑脚本之前,先把环境搭好。我用的是Python 3.10,核心依赖两个库:

pip install psd-tools pytoshop pillow

选型理由:psd-tools擅长读取和解析PSD,写入能力相对弱;pytoshop的写入API更完整,支持图层、蒙版、文字;Pillow负责生成每个图层的像素数据。三者配合,覆盖"造像素—组图层—写文件"全流程。

如果你只装psd-tools,会发现它的PSDImage.frompil()只能做很基础的合成,图层属性控制有限。这是我踩过的第一个坑:以为一个库能搞定所有事,结果卡在文字图层上折腾了半天。

4.2 一段可运行的生成脚本

下面这段代码是我根据提示词模板让Codex生成后、手工调整过的版本,去掉了几个API误用,可以直接跑:

import os from PIL import Image, ImageDraw, ImageFont import pytoshop from pytoshop.user import nested_layers from pytoshop.enums import ColorMode, BlendMode W, H = 1080, 1920 os.makedirs("./output", exist_ok=True) # 背景层 bg = Image.new("RGB", (W, H), (26, 26, 46)) # 装饰圆形层(带透明通道) circle = Image.new("RGBA", (W, H), (0, 0, 0, 0)) draw = ImageDraw.Draw(circle) draw.ellipse([W-400, H-400, W, H], fill=(233, 69, 96, 255)) # 文字层(这里用像素方式,保证兼容性) text_layer = Image.new("RGBA", (W, H), (0, 0, 0, 0)) tdraw = ImageDraw.Draw(text_layer) try: font_main = ImageFont.truetype("SourceHanSansCN-Bold.otf", 120) font_sub = ImageFont.truetype("SourceHanSansCN-Regular.otf", 48) except OSError: font_main = ImageFont.load_default() font_sub = ImageFont.load_default() tdraw.text((W//2, 600), "限时活动", font=font_main, fill=(255, 255, 255, 255), anchor="mm") tdraw.text((W//2, 800), "立即参与", font=font_sub, fill=(255, 215, 0, 255), anchor="mm") # 组装图层(从下到上) layers = [ nested_layers.Image(name="背景", visible=True, opacity=255, blend_mode=BlendMode.normal, image=bg), nested_layers.Image(name="装饰圆形", visible=True, opacity=255, blend_mode=BlendMode.normal, image=circle), nested_layers.Image(name="主标题", visible=True, opacity=255, blend_mode=BlendMode.normal, image=text_layer), ] psd = nested_layers.nested_layers_to_psd( layers, color_mode=ColorMode.rgb, size=(H, W), # 注意这里是 (高, 宽) depth=8, ) with open("./output/poster.psd", "wb") as f: psd.write(f) print("PSD 已生成")

这段代码跑完,./output/poster.psd就是一个三图层的PSD文件,用Photoshop打开能看到独立的背景、圆形、文字三个图层。

4.3 脚本里三个容易翻车的细节

第一个坑:size参数的顺序。pytoshop的nested_layers_to_psd接收的size是(height, width),不是(width, height)。我第一次跑的时候按直觉传了(1080, 1920),结果生成的PSD是竖着的1080宽、1920高变成了1920宽、1080高,整个画布方向反了。这个坑很隐蔽,因为代码不报错,只是结果不对。

第二个坑:文字层的锚点。Pillow的anchor="mm"表示以文字中心为锚点,这样(W//2, 600)就是文字正中心的位置。如果不加anchor,默认锚点是左上角,文字会偏到右下。这个细节提示词里通常不会写,但实际效果差别很大。

第三个坑:字体文件路径。代码里用的SourceHanSansCN-Bold.otf需要你本地真的有这个字体文件,否则会走except分支用默认字体,而默认字体不支持中文,画出来全是方块。中文字体一定要显式指定路径,这是中文场景下最容易忽略的一步。

4.4 生成结果验证:怎么确认PSD没坏

脚本跑完不代表PSD能用。我习惯用两步验证:先用psd-tools读一遍,确认图层数量和名称对得上;再用Photoshop或GIMP打开,确认视觉效果正常。

from psd_tools import PSDImage psd = PSDImage.open("./output/poster.psd") print("画布尺寸:", psd.size) for layer in psd: print(f"图层: {layer.name}, 可见: {layer.visible}, 不透明度: {layer.opacity}")

如果输出的图层列表和提示词里描述的一致,基本就没问题。如果发现图层少了或者名字乱了,回去检查提示词里的图层清单是不是有歧义。

5. 提示词进阶:让Codex处理复杂图层结构

5.1 图层组嵌套怎么描述

真实的设计稿很少是平铺的图层,通常有图层组。比如一个海报可能有"背景组""内容组""装饰组",组里再套图层。提示词里描述嵌套结构,用缩进最直观:

图层结构(缩进表示嵌套): - 背景组 - 底色层 - 纹理层 - 内容组 - 主标题 - 副标题 - 装饰组 - 左上角光斑 - 右下角圆形

Codex看到这种缩进结构,会生成对应的嵌套图层代码。实测下来,两层嵌套的准确率很高,三层以上偶尔会出错,需要人工核对。

5.2 蒙版和剪贴蒙版的表达

蒙版是PSD的高级特性,提示词里要明确说"图层蒙版"还是"剪贴蒙版"。前者是给单个图层加一个灰度遮罩,后者是用下层图层的形状裁剪上层。这两者在代码里的实现完全不同,混了就会出问题。

我的经验是:如果只是要"某个区域显示某个图层",用剪贴蒙版描述更简单,因为它的逻辑是"上层被下层形状裁剪",符合直觉。图层蒙版适合做渐变过渡,描述时要给出蒙版的灰度分布。

5.3 批量生成:把变量抽出来

如果你要生成一批PSD,比如100张不同文案的海报,提示词里应该把可变部分标出来:

文案从CSV读取,每行包含:主标题、副标题、背景色。 对每一行生成一个PSD,文件名用主标题命名。

Codex会生成一个循环结构,把单次生成逻辑包进去。这里要注意:批量生成时每个PSD的图层结构要一致,只是内容不同。如果每张的图层数都不一样,代码复杂度会飙升,不如拆成多个模板。

6. 那些文档里不会写的踩坑记录

6.1 库版本不匹配导致的诡异报错

pytoshop这个库更新不算频繁,但不同版本之间的API有差异。我遇到过nested_layers.Image在某个版本里参数名从blend_mode变成了blend,代码直接报TypeError。解决办法是锁定版本,在requirements.txt里写死pytoshop==1.2.1这种,别用latest。

6.2 大画布的内存问题

生成4K以上的PSD时,每个图层都是一张全尺寸的RGBA图,内存占用是宽×高×4字节×图层数。一张4096×4096的图,单图层就64MB,10个图层就是640MB。如果批量生成,内存很容易爆。我的做法是按需裁剪图层:如果某个图层只占画布一小块,就只生成那一块的像素,再用偏移量定位,而不是生成全尺寸透明图。

6.3 颜色模式的坑:RGB和CMYK不能混

PSD支持RGB和CMYK两种主要颜色模式,但它们的通道数不同(RGB是3通道,CMYK是4通道)。如果提示词里说"CMYK模式"但代码里用RGB的像素数据,生成的PSD打开会偏色或者直接报错。印刷用途才用CMYK,屏幕用途一律RGB,这个选择要在提示词里明确。

6.4 文字图层栅格化的取舍

前面提过,可编辑文字图层和像素文字图层是两条路。可编辑的好处是后期能改字,坏处是依赖字体环境,换台电脑打开可能字体丢失。像素文字的好处是所见即所得,坏处是不能改。我的建议是:模板类PSD用可编辑文字,成品类PSD用像素文字。提示词里根据用途选一种,别指望两者兼得。

7. 从"能生成"到"好用":几个提升成功率的习惯

第一个习惯是先写结构再写提示词。我现在的流程是:先在纸上画出图层树,标好每层的属性和顺序,再把这个结构翻译成提示词。这样写出来的提示词逻辑清晰,Codex也容易理解。直接对着空白文档憋提示词,往往写着写着就漏了图层。

第二个习惯是给Codex一个参考库。如果我知道要用pytoshop,会在提示词里加一句"使用pytoshop的nested_layers模块",这样它就不会去选别的库。指定库能大幅降低API误用的概率。

第三个习惯是分步验证。不要一次性让Codex生成完整脚本就跑,先让它生成"创建画布并保存空PSD"的最小代码,跑通后再逐步加图层。这样出问题时容易定位是哪一步的错。

第四个习惯是保留中间产物。生成每个图层的像素图时,顺手存一份PNG到临时目录。这样如果最终PSD有问题,可以单独检查每个图层对不对,而不是对着一个打不开的文件干瞪眼。

8. 这套方法能扩展到什么程度

聊到这儿,其实"让Codex生成PSD"这件事的天花板不在Codex,而在你对PSD结构的理解深度。你能描述多复杂的结构,它就能生成多复杂的脚本。我目前用它做过批量海报模板、电商主图分层文件、UI设计稿的图层骨架,效果都还不错。

再往深走,可以结合图像生成模型:让模型生成每个图层的素材图,Codex负责组装成PSD。这样"AI出图"和"AI写代码"就串起来了,产出的是可编辑的分层文件,而不是一张死图。这个组合在实际项目里很实用,尤其是需要批量产出、又要保留后期修改空间的场景。

最后分享一个我自己的判断标准:如果这个PSD你打算后期手动调整,那就值得用代码生成分层结构;如果只是要一张成品图,直接出图更快。工具是为人服务的,别为了用AI而用AI。

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

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

立即咨询