feat: add edutainment drawing and visual package flows
This commit is contained in:
@@ -270,6 +270,368 @@ const assetDefinitions = [
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-head-guide',
|
||||
output: 'picture-book-wave-cat-head-guide-v1.png',
|
||||
sourceOutput: 'picture-book-wave-cat-head-guide-v1-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.76,
|
||||
fillHeight: 0.76,
|
||||
anchorY: 'center',
|
||||
padding: 22,
|
||||
},
|
||||
prompt: [
|
||||
'请生成儿童动作互动游戏招手提示中央使用的卡通猫猫头资产,只画猫猫头,不要身体和爪子。',
|
||||
'主体是一只原创绘本卡通猫猫头,圆润、亲切、表情开心,适合夹在左右两只猫爪中间作为挥手引导。',
|
||||
'猫头可以是浅米白、淡橘、柔和浅棕和浅蓝绿色高光,轮廓清晰,五官简洁可爱,不能像真实照片或具体 IP 角色。',
|
||||
'资产需要轻盈半透明、水彩纸张质感,缩小后仍能清楚看出猫脸和耳朵,边缘不要有复杂毛发。',
|
||||
'整体风格必须和参考背景一致:明亮、温暖、卡通绘本、草地游戏舞台气质。',
|
||||
'不要文字、数字、按钮、面板、人物、全身动物、品牌符号、水印、真实照片质感、厚重阴影或科技感。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-paw-guide',
|
||||
output: 'picture-book-wave-cat-paw-guide-v1.png',
|
||||
sourceOutput: 'picture-book-wave-cat-paw-guide-v1-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.82,
|
||||
fillHeight: 0.82,
|
||||
anchorY: 'center',
|
||||
padding: 22,
|
||||
},
|
||||
prompt: [
|
||||
'请生成儿童动作互动游戏的挥手引导猫爪资产,只画一只猫爪和一小段前臂,用于网页左右镜像复用。',
|
||||
'主体是一段从画面下方斜向上伸出的柔软卡通猫前臂,末端是圆润猫爪,不展示手指细节,爪垫可以用几个浅色圆形简化表达。',
|
||||
'猫爪需要像儿童绘本里的玩偶圆爪,简洁可爱,适合放在猫猫头左右两侧做左右摆动动画。',
|
||||
'资产需要半透明、轻盈,轮廓清晰,缩小后仍能看出前臂和猫爪;边缘不要复杂毛发,不要尖爪。',
|
||||
'颜色使用浅米白、淡橘、柔和草绿色和浅蓝绿色水彩高光,风格和参考背景一致,明亮、温暖、卡通绘本、轻微纸张纹理。',
|
||||
'不要文字、数字、按钮、面板、人物全身、完整动物、真实照片质感、厚重阴影或科技感。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-head-guide-v2',
|
||||
output: 'picture-book-wave-cat-head-guide-v2.png',
|
||||
sourceOutput: 'picture-book-wave-cat-head-guide-v2-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.72,
|
||||
fillHeight: 0.72,
|
||||
anchorY: 'center',
|
||||
padding: 24,
|
||||
},
|
||||
prompt: [
|
||||
'请重新设计一版儿童动作互动游戏招手提示中央使用的原创绘本卡通猫猫头资产,只画猫猫头,不要身体和爪子。',
|
||||
'主体是一只圆润的小猫头,像贴在游戏舞台中央的柔软绘本贴纸,轮廓大而简洁,表情开心、友好、轻轻张嘴微笑。',
|
||||
'五官必须更简化:大眼睛、短鼻子、小嘴巴、短胡须即可;不要长胡须伸出太远,不要复杂毛发,不要真实猫毛细节。',
|
||||
'色彩使用浅奶油白、淡橘和少量浅草绿或天空蓝高光,整体更轻、更通透,适合叠在明亮草地舞台上。',
|
||||
'边缘是柔和水彩描边和轻微纸张纹理,缩小到舞台中央后仍能一眼看出是可爱的猫猫头。',
|
||||
'不要文字、数字、按钮、面板、人物、全身动物、品牌符号、水印、真实照片质感、厚重阴影或科技感。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-paw-guide-v2',
|
||||
output: 'picture-book-wave-cat-paw-guide-v2.png',
|
||||
sourceOutput: 'picture-book-wave-cat-paw-guide-v2-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.74,
|
||||
fillHeight: 0.78,
|
||||
anchorY: 'center',
|
||||
padding: 24,
|
||||
},
|
||||
prompt: [
|
||||
'请重新设计一版儿童动作互动游戏挥手引导猫爪资产,只画一只圆润猫爪和很短一段前臂,用于网页左右镜像复用。',
|
||||
'主体是大号圆猫爪,爪面朝向观众,爪垫用一个浅粉色大圆垫和几个浅粉色小圆垫简化表达,前臂只保留短短一截,不要画成长手臂。',
|
||||
'猫爪要像儿童绘本贴纸或软玩具爪子,轮廓饱满、简洁、可爱,适合放在猫猫头左右两侧做挥动动画。',
|
||||
'色彩与猫猫头统一:浅奶油白、淡橘、柔和浅粉或淡桃色爪垫和少量浅草绿或天空蓝高光;整体半透明、轻盈、无厚重阴影。',
|
||||
'爪垫必须保持明亮柔和,禁止黑色、灰色、深棕色、深色阴影或高反差硬边。',
|
||||
'缩小后必须清楚看出猫爪轮廓和爪垫;不要尖爪、不要手指细节、不要真实皮肤或真实毛发质感。',
|
||||
'不要文字、数字、按钮、面板、人物全身、完整动物、真实照片质感、厚重阴影或科技感。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'ground-ring-v3',
|
||||
output: 'picture-book-ground-ring-v3.png',
|
||||
sourceOutput: 'picture-book-ground-ring-v3-source.png',
|
||||
size: '1536x512',
|
||||
transparent: true,
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1200,
|
||||
canvasHeight: 520,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.92,
|
||||
fillHeight: 0.78,
|
||||
anchorY: 'center',
|
||||
padding: 24,
|
||||
},
|
||||
prompt: [
|
||||
'请重新设计儿童动作互动游戏地面位置指示环资产,用于放在绿色草地上,必须和草皮明显区分。',
|
||||
'主体是单个贴在地面上的透视椭圆指示环,不是完整背景,不要依赖网页后期压扁。',
|
||||
'样式像浅蓝天空色和暖黄色软垫组成的绘本地贴:外圈为浅蓝白水彩描边,内圈有柔和暖黄色或奶油色高光,中心留空透明。',
|
||||
'圆环边缘可以有少量星星光点、短虚线或纸贴边,但不要用大面积绿色草叶作为主体,避免和草地混在一起。',
|
||||
'禁止使用粉紫色、品红色、紫色外圈、玫红光晕或任何接近 #ff00ff 的颜色;这些颜色会被当成透明背景删除。',
|
||||
'除纯色品红背景外,主体只能使用浅蓝、白色、奶油黄、暖黄色、浅橙和极少量浅草绿。',
|
||||
'整体要明亮、温暖、儿童绘本风,和草地舞台统一但有清楚视觉对比;不要科技感,不要霓虹,不要金属材质。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-torso-guide-v3',
|
||||
output: 'picture-book-wave-cat-torso-guide-v3.png',
|
||||
sourceOutput: 'picture-book-wave-cat-torso-guide-v3-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.62,
|
||||
fillHeight: 0.58,
|
||||
anchorY: 'bottom',
|
||||
padding: 24,
|
||||
},
|
||||
prompt: [
|
||||
'请为输入图中的橘白绘本猫猫头补充一个可单独叠放在头部下方的猫猫上半身胸口资产。',
|
||||
'只画短短的上半身胸口、脖子下沿、圆润肩膀和一点点短前肢根部;不要画头、耳朵、眼睛、嘴巴、胡须、完整爪子、腿或脚。',
|
||||
'主体必须是橘白小猫身体,色彩和输入图一致:浅奶油白为主,淡橘色斑纹点缀,柔和浅棕描边,少量浅草绿或天空蓝高光。',
|
||||
'形状像儿童绘本贴纸里的圆润上半身,底部自然截断,适合网页叠在猫头下面形成半身猫猫。',
|
||||
'两侧不要伸出长手臂,左右猫爪会由网页单独叠加。',
|
||||
'禁止黑色、黑白猫、大面积深色毛、真实毛发、尖锐漫画黑线、高反差阴影。',
|
||||
'不要文字、数字、按钮、面板、人物、完整动物、品牌符号、水印、真实照片质感、厚重阴影或科技感。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-body-guide-v4',
|
||||
output: 'picture-book-wave-cat-body-guide-v4.png',
|
||||
sourceOutput: 'picture-book-wave-cat-body-guide-v4-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
useWaveCatHeadReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.78,
|
||||
fillHeight: 0.88,
|
||||
anchorY: 'bottom',
|
||||
padding: 24,
|
||||
},
|
||||
prompt: [
|
||||
'请按参考结构重新绘制儿童动作互动游戏中央招手提示的猫咪身体主体资源。',
|
||||
'主体结构参考用户草图:正面半身猫咪,圆猫头在上方,两个三角耳朵,头下方接一个简单圆润躯干,躯干到胸口和腰部一半为止。',
|
||||
'本资源只包含猫头、耳朵、脖子、躯干和肩部连接点,不要画任何手臂、前臂、手掌、猫爪、腿或脚;左右肩膀两侧要留出手臂接入空间。',
|
||||
'角色必须是橘白猫:主体毛色 80% 为浅奶油白和温暖淡橘色,少量浅棕描边;只能有小面积深棕眼睛和细线五官。',
|
||||
'五官简洁可爱:大眼睛、短鼻子、小嘴巴、短胡须;躯干为浅奶油白和淡橘色斑纹,边缘柔和水彩描边。',
|
||||
'整体像儿童绘本贴纸,半透明、轻盈,缩小到舞台中央后仍能看清猫头和半身结构。',
|
||||
'禁止画手臂或猫爪,禁止黑色、灰色、黑白猫、奶牛猫、虎斑深色块、大面积深棕毛、真实毛发、尖锐漫画黑线、高反差阴影、文字、数字、按钮、面板、水印和真实照片质感。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-arm-guide-v4',
|
||||
output: 'picture-book-wave-cat-arm-guide-v4.png',
|
||||
sourceOutput: 'picture-book-wave-cat-arm-guide-v4-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.7,
|
||||
fillHeight: 0.82,
|
||||
anchorY: 'bottom',
|
||||
padding: 24,
|
||||
},
|
||||
prompt: [
|
||||
'请按参考结构重新绘制儿童动作互动游戏猫咪挥手动画用的单侧手臂资源。',
|
||||
'只画一条橘白猫咪手臂:从肩膀连接处开始,弯曲向上,包含上臂、前臂和末端圆猫爪,整体像用户草图中单侧向上挥动的弯曲手臂。',
|
||||
'资源需要适合网页左右镜像复用:默认绘制一条从画面下方肩部连接点向上弯到画面左上方的手臂,肩部连接点在资源下方内侧,方便 CSS 设置旋转轴。',
|
||||
'猫爪末端是圆润猫爪,爪垫浅粉或淡桃色,不要尖爪;手臂粗细均匀、短而可爱,不要画成长人类手臂。',
|
||||
'角色必须是橘白猫手臂:主体毛色 80% 为浅奶油白和温暖淡橘色,淡橘斑纹点缀,柔和浅棕描边,爪垫浅粉或淡桃色。',
|
||||
'整体像儿童绘本贴纸,半透明、轻盈,边缘清晰,缩小后仍能看出弯曲手臂和圆猫爪。',
|
||||
'不要画猫头、躯干、另一只手臂、完整动物、腿、脚、文字、数字、按钮、面板、水印、真实照片质感、黑色、灰色、黑白毛、黑灰重阴影或深色大面积毛。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-body-guide-v5',
|
||||
output: 'picture-book-wave-cat-body-guide-v5.png',
|
||||
sourceOutput: 'picture-book-wave-cat-body-guide-v5-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
transparencyCleanup: 'cat-guide',
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
useWaveCatHeadReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.72,
|
||||
fillHeight: 0.88,
|
||||
anchorY: 'bottom',
|
||||
padding: 22,
|
||||
},
|
||||
prompt: [
|
||||
'请按用户参考结构重新绘制儿童动作互动游戏中央招手提示的猫咪身体主体资源,用作动画底座。主体必须是正面纸偶结构:一个大圆猫头、两个三角耳朵、头下方连接短脖子和圆润半身躯干,画到上半身和腰部一半即可。',
|
||||
'本资源只包含猫头、耳朵、五官、脖子、躯干、圆润肩膀和两侧肩部连接点;绝对不要画任何手臂、前臂、手掌、猫爪、小手、小脚、腿、脚或尾巴。左右肩膀外侧需要留出干净的手臂接入空间,方便网页单独叠加手臂动画。',
|
||||
'请保持输入猫猫头的暖橘白绘本风格:头顶和耳朵外侧有淡橘色块,脸和肚子为浅奶油白,少量浅橘斑纹,五官只用小面积深棕眼睛和暖棕细线。',
|
||||
'所有描边必须是柔和暖棕或浅橘棕,不要使用纯黑描边;资源自身保持清晰不透明,网页会统一设置半透明效果,不要在图片里主动降低主体透明度。',
|
||||
'整体像儿童绘本贴纸或可动纸偶底座,结构简单、比例可爱,缩小到舞台中央后仍能看清大猫头、小身体和肩部挂点。',
|
||||
'禁止画手臂或猫爪,禁止黑色、灰色、黑白猫、奶牛猫、虎斑深色块、大面积深棕毛、真实毛发、尖锐漫画黑线、高反差阴影、文字、数字、按钮、面板、水印和真实照片质感。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-arm-guide-v5',
|
||||
output: 'picture-book-wave-cat-arm-guide-v5.png',
|
||||
sourceOutput: 'picture-book-wave-cat-arm-guide-v5-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
transparencyCleanup: 'cat-guide',
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
useWaveCatHeadReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.58,
|
||||
fillHeight: 0.86,
|
||||
anchorY: 'bottom',
|
||||
padding: 20,
|
||||
},
|
||||
prompt: [
|
||||
'请按用户参考结构重新绘制儿童动作互动游戏猫咪挥手动画用的单侧手臂手部资源。只画一条猫咪手臂:从底部肩膀连接点开始,包含短上臂、弯曲前臂和末端圆猫爪,像可动纸偶的一条独立手臂。',
|
||||
'默认绘制一条向左上方举起的手臂,肩膀连接点在画面底部偏内侧,圆猫爪在画面上方;资源需要适合网页左右镜像复用和围绕肩膀连接点旋转摆动。',
|
||||
'猫爪用类似多啦A梦圆手的圆润简化形状,不展示手指细节,不要尖爪;爪面可以有浅粉或淡桃色圆形爪垫。手臂短而可爱,比例像小猫上肢,不要画成人类长手臂。',
|
||||
'请保持输入猫猫头的暖橘白绘本风格:手臂主体为浅奶油白和淡橘色,少量浅橘斑纹,爪垫浅粉或淡桃色,柔和暖棕描边。',
|
||||
'所有描边必须是柔和暖棕或浅橘棕,不要使用纯黑描边;资源自身保持清晰不透明,网页会统一设置半透明效果,不要在图片里主动降低主体透明度。',
|
||||
'不要画猫头、躯干、另一只手臂、完整动物、腿、脚、文字、数字、按钮、面板、水印、真实照片质感、黑色、灰色、黑白毛、黑灰重阴影或深色大面积毛。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-body-guide-v6',
|
||||
output: 'picture-book-wave-cat-body-guide-v6.png',
|
||||
sourceOutput: 'picture-book-wave-cat-body-guide-v6-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
transparencyCleanup: 'cat-guide',
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
useWaveCatHeadReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.68,
|
||||
fillHeight: 0.86,
|
||||
anchorY: 'bottom',
|
||||
padding: 22,
|
||||
},
|
||||
prompt: [
|
||||
'请重新绘制儿童动作互动游戏中央招手提示的猫咪身体主体资源,严格按可动纸偶拆件结构生成。主体只有一只正面橘白猫:大圆猫头、两个三角耳朵、短脖子、梨形半身躯干,底部自然截断。',
|
||||
'身体两侧只允许出现圆润肩膀轮廓和一个很小的肩部连接圆点或肩窝标记;绝对不要画伸出的手臂、前臂、手掌、猫爪、小手、小脚、腿、脚或尾巴。肩膀外侧必须留空,后续网页会单独叠加两条手臂。',
|
||||
'猫咪造型参考输入猫猫头的暖橘白配色:头顶、耳朵外侧和身体侧边为淡橘色,脸和肚子为浅奶油白,少量浅橘斑纹;五官使用暖棕细线和小面积深棕眼睛。',
|
||||
'请避免粉色大背景、避免主体外侧彩色光晕,主体贴纸外轮廓之外必须直接是纯色背景;线条为柔和暖棕或浅橘棕,不要纯黑粗描边。',
|
||||
'资源自身保持清晰不透明,半透明效果由网页 CSS 控制;整体像儿童绘本可动纸偶底座,缩小后仍能看清大猫头、短身体、肩部连接点。',
|
||||
'禁止手臂、爪子、小手、脚、尾巴;禁止黑色、灰色、黑白猫、奶牛猫、虎斑深色块、大面积深棕毛、真实毛发、尖锐漫画黑线、高反差阴影、文字、数字、按钮、面板、水印和真实照片质感。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
{
|
||||
id: 'wave-cat-arm-guide-v6',
|
||||
output: 'picture-book-wave-cat-arm-guide-v6.png',
|
||||
sourceOutput: 'picture-book-wave-cat-arm-guide-v6-source.png',
|
||||
size: '1024x1024',
|
||||
transparent: true,
|
||||
transparencyCleanup: 'cat-guide',
|
||||
useBackgroundReference: true,
|
||||
useLayoutReference: true,
|
||||
useWaveCatHeadReference: true,
|
||||
layoutNormalization: {
|
||||
canvasWidth: 1024,
|
||||
canvasHeight: 1024,
|
||||
fit: 'contain',
|
||||
fillWidth: 0.74,
|
||||
fillHeight: 0.88,
|
||||
anchorY: 'bottom',
|
||||
padding: 20,
|
||||
},
|
||||
prompt: [
|
||||
'请重新绘制儿童动作互动游戏猫咪挥手动画用的单侧手臂资源,严格作为可动纸偶拆件。只画一条橘白猫手臂:底部是肩膀连接端,向左上方弯曲,末端是一只简化圆猫手。',
|
||||
'猫手必须像多啦A梦式圆手或软玩具圆爪:一个完整圆润手掌,不画手指,不画黑色或深色爪垫,不画粉色爪垫点,不画尖爪。手臂短而厚实,像小猫上肢,不要成人类长手臂。',
|
||||
'资源必须适合网页左右镜像复用和围绕肩部连接点旋转:肩膀连接端在画面底部偏内侧,圆手在画面上方,四周留透明空白。',
|
||||
'颜色参考输入猫猫头:浅奶油白和淡橘色为主体,少量浅橘斑纹,柔和暖棕或浅橘棕描边;不要纯黑粗描边。',
|
||||
'请避免粉色大背景、避免主体外侧彩色光晕,主体贴纸外轮廓之外必须直接是纯色背景。资源自身保持清晰不透明,半透明效果由网页 CSS 控制。',
|
||||
'不要画猫头、躯干、另一只手臂、完整动物、腿、脚、文字、数字、按钮、面板、水印、真实照片质感、黑色、灰色、黑白毛、黑灰重阴影或深色大面积毛。',
|
||||
styleReferenceNote,
|
||||
noStretchNote,
|
||||
chromaKeyNote,
|
||||
].join(''),
|
||||
},
|
||||
];
|
||||
|
||||
const args = new Map();
|
||||
@@ -443,6 +805,12 @@ function buildRequestBody(asset, size) {
|
||||
path.join(intermediateDir, layoutReferenceOutput),
|
||||
);
|
||||
}
|
||||
if (asset.useWaveCatHeadReference) {
|
||||
pushReferenceImage(
|
||||
body,
|
||||
path.join(assetDir, 'picture-book-wave-cat-head-guide-v2.png'),
|
||||
);
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
@@ -670,6 +1038,93 @@ function removeCharacterOutlineChromaKey(sourcePath, finalPath) {
|
||||
}
|
||||
}
|
||||
|
||||
function removeCatGuideChromaKey(sourcePath, finalPath) {
|
||||
const script = [
|
||||
'from collections import deque',
|
||||
'from PIL import Image',
|
||||
'import sys',
|
||||
'source, out = sys.argv[1], sys.argv[2]',
|
||||
'im = Image.open(source).convert("RGBA")',
|
||||
'px = im.load()',
|
||||
'w, h = im.size',
|
||||
'corner_samples = [im.getpixel((0, 0)), im.getpixel((w - 1, 0)), im.getpixel((0, h - 1)), im.getpixel((w - 1, h - 1))]',
|
||||
'key = tuple(sorted([p[i] for p in corner_samples])[len(corner_samples) // 2] for i in range(3))',
|
||||
'def is_magenta_bg(r, g, b):',
|
||||
' if r > 170 and b > 145 and g < 185 and min(r, b) - g > 36:',
|
||||
' return True',
|
||||
' return r > 140 and b > 90 and r > g + 35 and b > g + 10',
|
||||
'def is_bg_candidate(x, y):',
|
||||
' r, g, b, a = px[x, y]',
|
||||
' if a <= 10:',
|
||||
' return True',
|
||||
' dist = ((r - key[0]) ** 2 + (g - key[1]) ** 2 + (b - key[2]) ** 2) ** 0.5',
|
||||
' if is_magenta_bg(r, g, b):',
|
||||
' return True',
|
||||
' if key[0] < 32 and key[1] < 32 and key[2] < 32:',
|
||||
' return dist < 34 and max(r, g, b) < 55',
|
||||
' if key[0] > 225 and key[1] > 225 and key[2] > 225:',
|
||||
' return dist < 34 and min(r, g, b) > 210',
|
||||
' return dist < 72',
|
||||
'visited = bytearray(w * h)',
|
||||
'queue = deque()',
|
||||
'def push(x, y):',
|
||||
' if x < 0 or y < 0 or x >= w or y >= h:',
|
||||
' return',
|
||||
' index = y * w + x',
|
||||
' if visited[index] or not is_bg_candidate(x, y):',
|
||||
' return',
|
||||
' visited[index] = 1',
|
||||
' queue.append((x, y))',
|
||||
'for x in range(w):',
|
||||
' push(x, 0)',
|
||||
' push(x, h - 1)',
|
||||
'for y in range(h):',
|
||||
' push(0, y)',
|
||||
' push(w - 1, y)',
|
||||
'while queue:',
|
||||
' x, y = queue.popleft()',
|
||||
' push(x + 1, y)',
|
||||
' push(x - 1, y)',
|
||||
' push(x, y + 1)',
|
||||
' push(x, y - 1)',
|
||||
'for _ in range(3):',
|
||||
' extra = []',
|
||||
' for y in range(1, h - 1):',
|
||||
' for x in range(1, w - 1):',
|
||||
' index = y * w + x',
|
||||
' if visited[index] or not is_bg_candidate(x, y):',
|
||||
' continue',
|
||||
' touches_bg = any(visited[(y + dy) * w + x + dx] for dy in (-1, 0, 1) for dx in (-1, 0, 1) if dx or dy)',
|
||||
' if touches_bg:',
|
||||
' extra.append(index)',
|
||||
' if not extra:',
|
||||
' break',
|
||||
' for index in extra:',
|
||||
' visited[index] = 1',
|
||||
'for y in range(h):',
|
||||
' for x in range(w):',
|
||||
' r, g, b, a = px[x, y]',
|
||||
' if visited[y * w + x]:',
|
||||
' px[x, y] = (r, g, b, 0)',
|
||||
' else:',
|
||||
' if a <= 10:',
|
||||
' a = 255',
|
||||
' px[x, y] = (r, g, b, a)',
|
||||
'im.save(out)',
|
||||
].join('\n');
|
||||
|
||||
const result = spawnSync('python', ['-c', script, sourcePath, finalPath], {
|
||||
cwd: repoRoot,
|
||||
encoding: 'utf8',
|
||||
});
|
||||
|
||||
if (result.status !== 0) {
|
||||
throw new Error(
|
||||
`Failed to clean cat guide transparency: ${(result.stderr || result.stdout).trim()}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeTransparentAsset(finalPath, layoutNormalization) {
|
||||
if (!layoutNormalization) {
|
||||
return;
|
||||
@@ -857,6 +1312,8 @@ async function generateAsset(asset, env, size, force) {
|
||||
removeUiPanelChromaKey(opaqueSourcePath, finalPath);
|
||||
} else if (asset.transparencyCleanup === 'character-outline') {
|
||||
removeCharacterOutlineChromaKey(opaqueSourcePath, finalPath);
|
||||
} else if (asset.transparencyCleanup === 'cat-guide') {
|
||||
removeCatGuideChromaKey(opaqueSourcePath, finalPath);
|
||||
} else {
|
||||
removeChromaKey(opaqueSourcePath, finalPath);
|
||||
}
|
||||
@@ -917,6 +1374,8 @@ async function generateAsset(asset, env, size, force) {
|
||||
removeUiPanelChromaKey(opaqueSourcePath, finalPath);
|
||||
} else if (asset.transparencyCleanup === 'character-outline') {
|
||||
removeCharacterOutlineChromaKey(opaqueSourcePath, finalPath);
|
||||
} else if (asset.transparencyCleanup === 'cat-guide') {
|
||||
removeCatGuideChromaKey(opaqueSourcePath, finalPath);
|
||||
} else {
|
||||
removeChromaKey(opaqueSourcePath, finalPath);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user