让 AI 画一张「手绘风」的图,最烦的不是画不好,是每次都画得不一样。今天给它一句「日系手绘」,明天它给你一个水彩,后天变成铅笔素描。你想要的那个味道,说不清、也锁不住。
handraw-style 就是冲着这件事来的:把画风变成编号。366 个画风各占一个号,你报一个编号,它就把那一款的线条、笔触、上色方式翻译成一段中英双语提示词,喂给生图模型。48 天冲到 6100 Star,配套还有 169 种排版图型、36 种主题色,以及 1 个主技能带 13 个子技能。
我把它拷进隔离沙箱跑了一整轮。先说结论:画风库本身是扎实的:366 张风格单图我逐张打开过,一张不缺、一张没坏。但它自己写的自检脚本在最新代码上是红的,打包命令跟着一起用不了。而它文档里反复强调的那条红线,恰恰没有任何脚本在查——我数出至少 29 条越线。
一、它把「画风」拆成了三样东西
普通人生图,是在跟模型聊天:「再文艺一点」「线条细一点」。这个项目换成填表:画风编号 + 排版编号 + 主题色编号,三样填完,提示词就成型了。
| 你能选的东西 | 数量 | 举例 |
|---|---|---|
| 画风(视觉语言) | 366 种 | 黑色简线、少量暖色腮红 |
| 排版图型(画面结构) | 169 种 | 社媒卡、信息图、漫画分镜 |
| 主题色 | 36 种 | C-01 克莱因蓝、C-26 柿子橙 |
这三样是分开的,这是它比同类做得细的地方:画风只管笔触和质感,排版只管信息怎么摆,颜色单独一层。你可以用同一套画风做小红书卡,也可以做长图,味道不散。
真正花心思的是下面这一层。它发现不同生图模型「听话程度」不一样——有的模型听到作者名就知道该画成什么样,有的必须把风格特征一条条念给它,还有的连特征都不管用、必须垫一张参考图。于是它给每个画风配了「该用哪种方式激活」的档案:
| 生图模型 | 只报名字就够 | 名字 + 风格特征 | 还要额外垫参考图 |
|---|---|---|---|
| 官方标定的 gpt-image-2 | 130 种(35.5%) | 199 种(54.4%) | 37 种(10.1%) |
| 没登记过的第三方模型 | 0 | 0 | 366 种(100%) |
换句话说:换个模型它不会装作自己还懂。认不出来就退回最保险的方式,让你传参考图。这份保守在开源项目里不多见,多数项目会假装自己通吃。
二、实测:它的自检脚本,自己在最新代码上是红的
我在一台隔离沙箱里跑完了它的全部检查,没有碰生产机。命令和结果都留在下面,你可以照着复现。
第一件事就跑它的官方自检——作者写明「发布前必须通过」的那个脚本。结果是失败,报错原文:
受版本管理的文件里泄漏了本地磁盘路径:一个生图示例脚本的第 11 行,写死了 `E:\handraw-style\output\…`
一行 Windows 盘符路径,卡住了整个自检。这段代码是昨天(10 月 23 日)随 v1.9.4 一起进来的。
我把这一行改成相对路径,别的什么都没动,再跑一次——通过,366 种画风、169 种图型、36 种颜色全绿,耗时 2.6 秒。
这个对比说明两件事:闸门的设计是有效的,它真的会拦;但它自己也真的会红,而且红了没人发现。
连带后果比这行路径严重。项目的打包脚本第一步就是调这个自检,所以:
| 我跑的东西 | 结果 |
|---|---|
| 官方自检(改前) | 失败,卡在一行盘符路径 |
| 官方自检(改那行后) | 通过,2.6 秒,366 / 169 / 36 全绿 |
| 官方打包命令 | 退出码 1,dist/ 目录根本没生成 |
| 前端逻辑测试 | 崩溃:断言还写着 331 种画风、166 种图型 |
| 发布审计脚本 | 6 个问题:5 处本机路径 + 1 处硬编码密钥 |
| 366 张风格单图逐张打开 | 0 张缺失、0 张损坏 |
最后两行值得单独说。
打包命令失败,意味着你按项目说明一步步操作,到最后一步拿不到安装包。不是装错,是根本没做出来。
前端测试崩溃,是因为这套测试写死了「331 种画风、166 种图型」——而库早就长到 366 和 169 了。我把数字跟上,它还是崩:界面里的风格选择器比库多一个条目(多一个「写实」入口),期望值得是 367。也就是说这个测试已经很久没人跑过了。
发布审计报的那条硬编码密钥,是我最意外的一处。审计脚本自己的说明写着「检查本机路径、常见凭据」,而它确实查出来了:一个本地生图服务的调用密钥,明文写在发布脚本里。项目根目录的发布检查记录却写着「无本机路径、常见凭据」。文档和工具在这里各说各话。
三、缺陷注入:闸门守住了什么,又放过了什么
光看全绿没用,我往库里塞了几处错,看它拦不拦。
| 我改坏了什么 | 闸门反应 |
|---|---|
| 删掉 1 张风格参考图 | 拦下:提示「366 张单图必须全部就位」 |
| 从旧编号映射表里删 1 条 | 拦下:提示「必须双向覆盖每一种风格」 |
把技能元数据字段名写错(name → nam3) |
拦下:提示「缺少必填的 name 或 description」 |
| 把某条风格特征里的否定句改成肯定句 | 放行,但生成提示词时被自动滤掉,没漏出去 |
| 在画廊里删掉一张画风卡片 | 没报错——因为自检会先重建一遍画廊,我的改动直接被覆盖了 |
前三条是真拦。第四条是设计得不错:风格特征里如果有人写了「避免画人物」这种否定句,它不会原样塞进提示词,而是过滤掉——这个细节说明作者想过提示词污染的问题。
第五条有意思:它不是防住了,是自愈了。自检在检查之前先把画廊整个重新生成一遍,所以你手改的 HTML 不算数。这既是保护,也意味着「检查」和「生成」这两件事被绑在一起——你没法用这个脚本去验别人给你的、已经生成好的包。
四、它自己写的红线,29 条越过去了
这个项目的说明文档里有一段写得特别硬:
严禁把参考图里的具体画面内容(具体人物、外貌、服饰、动作、道具、具体动植物、具体场景)写进风格特征。只能写纯视觉语言:媒介材质、色彩光影、空间景深。
>
禁止出现的反例:「白色棉麻长裙的年轻女性」「黑色短发」「侧身回眸」「咖啡杯」「雨伞」。
理由很实际:风格特征会被塞进每一条提示词里。如果某条风格里写死了「围巾+小鸟」,那你画「宇航员在月球」时,模型也会给你加一条围巾、一只鸟。风格应该对主题完全透明。
我把 366 条风格特征逐条过了一遍。剔除「避免 / 不要」这类否定句后,仍有至少 29 条写进了具体画面内容,占全部有特征描述的 348 条的 8.3%:
| 类别 | 条数 |
|---|---|
| 具体服饰(围巾、牛仔裤、鞋带) | 12 |
| 姿态动作(坐姿、站立、回眸) | 6 |
| 外貌(黑色长发、卷发、眼镜) | 6 |
| 具体动植物(猫、鸟、小狗) | 5 |
| 具体场景(咖啡馆、屋顶、街角) | 5 |
| 道具(咖啡杯、雨伞) | 2 |
对照着看最清楚。文档点名的反例是「黑色短发」,库里有一条编号写着「黑色长发女性、坐姿、白上衣与蓝色牛仔裤」;文档点名「雨伞」「咖啡杯」,另外两条写的正是「咖啡馆水汽与雨伞街景」和「咖啡馆日常」。一条不差,全在文档亲手列的清单上。
要说明的是,我这是按关键词规则匹配的,判据是文档自己点名的那几类词,所以可能有误伤——比如「帽子」在某些风格里确实属于造型语言。但反过来也可能漏:写的是「人物」「主角」这类抽象词、没落到具体服饰的,我没算进去。29 是个下限,你可以按编号自己复核。
问题不在这些条目本身,而在没人拦它们。自检脚本查了图片有没有、编号连不连续、元数据字段全不全、失败提示里的路径泄没泄漏——唯独没查作者自己反复强调的那条铁律,一个字都没查。这条线是靠人守的,而现在看,人没守住。
五、我的判断
值得装,但要按「素材库」理解它,不要按「质量守门人」。
它最值钱的是那 366 张风格单图。我逐张打开验过:零缺失、零损坏,画廊里 369 处图片引用全部命中本地文件。另外 36 种画风还多配了一张四宫格参考图,生图时垫进去,风格能稳住。光这批图就值回它 226 MB 的体积(其中 110 MB 是 Git 历史)。
模型能力分层那一层同样值得学。它没有对所有模型说同一句话,而是承认「有的模型听不懂」,听不懂就退回最保险的路径。这是工程上的诚实。
但两条得自己盯着:
一,别信「全绿」。它的自检在最新代码上是红的,打包命令跟着失效。你要用,先把那行盘符路径改成本机的相对路径,再看一遍输出。两分钟的事,但这一步 README 不会告诉你。
二,它给画风写的特征不完全可信。至少 29 条把具体画面内容写了进去,而那正是它自己禁止的事。用这些编号出图时,你想要的画面主题会被参考图里的衣服、动物、场景污染。稳妥的做法是:出图前先看一眼这条画风的特征描述,觉得混进了具体物件,就自己删掉再喂给模型。
一句话收尾:一个把「怎么让模型听懂画风」想得很透、把「怎么管住自己」做得还没跟上的项目。素材可以放心用,闸门要自己带着。
关注 AI商业快讯,每天一篇 AI 热点深度解读。
相关阅读: