现在生成的人脸类头像,肤色是从 7 色调色板里随机取的:
// inc/theme-avatar.php yang_avatar_palette() 'skinColor' => array( 'f2d3b8', 'e8b98f', 'd9a066', 'c68642', '8d5524', 'ffdbac', 'f1c27d', ),
其中最深的 8d5524 在头像上会呈现为深棕/黑色皮肤。用户要求:只保留黄种人肤色,不要黑种人,白种人也不要。
8d5524
avataaars
lorelei
open-peeps
pixel-art
skinColor
yang_avatar_style_palette()
Yang_Avatar_Prng::pick()
return $arr[$this->integer(0, count($arr) - 1)];
next()
实测四套的肤色命中情况(8 个种子,统计调色板里 7 个色值的出现次数):
c68642
把 skinColor 调色板收窄到只留黄种人区间。
初步候选(原 7 色里偏黄/偏浅的 4 个): ffdbac(最浅)、f2d3b8、f1c27d、e8b98f 去掉的是 d9a066(偏深)、c68642(深棕)、8d5524(最深)。
ffdbac
f2d3b8
f1c27d
e8b98f
d9a066
fill
bottts
shapes
rings
glass
identicon
initials
icons
/theme-update/
已实现并发布到 3.2.39(代码提交 203721b)。
人脸型风格的肤色从 7 档收窄到 4 档,只保留最浅到偏黄的区间:
按你的要求:白种人那种最白的没留(ffdbac 其实是偏象牙黄,不是纯白),黑种人的深棕和黑色全去掉了。
DiceBear 的随机数生成器在取颜色时是这样用的:
$arr[$this->integer(0, count($arr) - 1)]
integer() 内部只调用一次 next(),消耗的随机数数量与区间跨度无关。所以把数组从 7 个缩到 4 个:
integer()
这一点用探针逐字节证明了:同一套风格、同一个种子,分别用 7 色和 4 色渲染,把两边的肤色色值都抹成占位符后,两份 SVG 逐字符相同(4 套风格 × 10 个邮箱 = 40 项全过)。也就是说没有顺带改动任何其它东西,你之前选好的头像除了肤色深浅,长相一模一样。
排查调色板时发现:baseColor 字段被错当成肤色映射了。
baseColor
baseColor 在各家风格里语义不统一 —— 在 bottts(机器人)里它是机器人的外壳颜色,有 19 种彩色。把它映射成肤色之后,机器人的外壳被涂成了肉色 e8b98f / f1c27d,非常难看。
已经从映射表里去掉。现在机器人的外壳恢复彩色。
theme-update
micah / adventurer 这两套是你的 18 套清单里没有的(它们许可要求署名,当初就排除了),所以传这两个名字会返回空。不是 bug。
micah
adventurer
update.json
No dependencies set.
The note is not visible to the blocked user.
现象
现在生成的人脸类头像,肤色是从 7 色调色板里随机取的:
其中最深的
8d5524在头像上会呈现为深棕/黑色皮肤。用户要求:只保留黄种人肤色,不要黑种人,白种人也不要。可行性(已实测,不是推断)
avataaars/lorelei/open-peeps/pixel-art各有skinColor,由yang_avatar_style_palette()注入调色板。实测四套都真的用到了(8 个种子逐个命中,见下表)。Yang_Avatar_Prng::pick()的实现是next()定索引)。所以缩短肤色数组后,其它组件(发型、衣着、表情)抽到的还是原来那些,只有肤色这一项变了。这点很关键:否则每次调肤色都等于重新洗牌。实测四套的肤色命中情况(8 个种子,统计调色板里 7 个色值的出现次数):
avataaarsc68642lorelei8d5524出现 3 次(最频繁)open-peeps8d5524pixel-art8d5524需要做的事
把
skinColor调色板收窄到只留黄种人区间。初步候选(原 7 色里偏黄/偏浅的 4 个):
ffdbac(最浅)、f2d3b8、f1c27d、e8b98f去掉的是
d9a066(偏深)、c68642(深棕)、8d5524(最深)。验收标准
fill,断言不含被移除的三个值)avataaars/lorelei/open-peeps/pixel-art)全部生效;不带肤色的风格(bottts等)不受影响备注
bottts(机器人)、shapes、rings、glass、identicon、initials、icons这些根本不画皮肤。/theme-update/通道,不覆盖服务器主题目录。已实现并发布到 3.2.39(代码提交 203721b)。
做了什么
人脸型风格的肤色从 7 档收窄到 4 档,只保留最浅到偏黄的区间:
ffdbacf2d3b8f1c27de8b98fd9a066c686428d5524按你的要求:白种人那种最白的没留(
ffdbac其实是偏象牙黄,不是纯白),黑种人的深棕和黑色全去掉了。为什么改数组长度是安全的(这点我专门证明了)
DiceBear 的随机数生成器在取颜色时是这样用的:
integer()内部只调用一次next(),消耗的随机数数量与区间跨度无关。所以把数组从 7 个缩到 4 个:这一点用探针逐字节证明了:同一套风格、同一个种子,分别用 7 色和 4 色渲染,把两边的肤色色值都抹成占位符后,两份 SVG 逐字符相同(4 套风格 × 10 个邮箱 = 40 项全过)。也就是说没有顺带改动任何其它东西,你之前选好的头像除了肤色深浅,长相一模一样。
顺带修掉一个老 bug
排查调色板时发现:
baseColor字段被错当成肤色映射了。baseColor在各家风格里语义不统一 —— 在bottts(机器人)里它是机器人的外壳颜色,有 19 种彩色。把它映射成肤色之后,机器人的外壳被涂成了肉色e8b98f/f1c27d,非常难看。已经从映射表里去掉。现在机器人的外壳恢复彩色。
验证
d9a066/c68642/8d5524一次都没出现theme-update下载回来的 zip 解包,实际渲染 40 张,0 空壳,4/4 浅肤色命中,0 深肤色需要说明的一点
micah/adventurer这两套是你的 18 套清单里没有的(它们许可要求署名,当初就排除了),所以传这两个名字会返回空。不是 bug。发布
update.json已指向 3.2.39,zip 与 readme 均 200