起因

当用户未设置 Gravatar 时,调用 gravatar 会返回默认的头像:

默认头像

如果访问博客的人清一色地未设置头像,那么一是很不美观,二是一堆默认头像堆在一起的时候,很难区分不同的人。对此,Gravatar 也提供了多种样式的根据 Hash 生成的默认头像,会随着哈希值的不同而返回不同的结果。

然而我个人不太喜欢这些头像。那何不自己实现呢?

素材

和换装小游戏一个原理:将头像内容按照部位分成不同的“组件”,譬如背景、身体、五官、帽子、眼镜、手套、戒指、衣服……每个组件虽然样式不同,但位置基本上是固定的,而后挑选不同的组件,按照一定的图层顺序叠加在一起1

dogface.png

映射

根据哈希的不同,我们要选取不同的组件,叠加成不同的头像,并且对于固定的一个哈希,每次生成的头像应该都是一样的,于是我们应该建立从哈希到各个组件的映射关系。

我这边选取的哈希算法是 MD5 算法,输出是 16 个字节;而我的组件一共有 9 类:"background", "hat", "body", "shirt", "eyes", "mouth", "card", "hand", "glove"。那么从哈希的第一个字节到第九个字节,分别对应 9 类组件,足矣。

而后便是根据字节的值,选取对应分类下的指定组件。由于这里单类组件数目小于 256,所以可以采用简单的分段法:假设该分类为 hat,其下组件数目为 8,而字节值范围为 0-255,那么每 256 / 8 长度的分组对应一个组件:0-31 对应 hat_0、32-63 对应 hat_1 ... 224-255 对应 hat_7.

根据哈希值依次选取组件后,叠加 PNG 组件素材即可生成最终头像。


  1. 大部分素材来源于 TheNando / dogatars