概述Identicon 是 Don Park 在2007年首次想出的。也许有些人对“Identicon”这词比较陌生,其实大家都认识的——就是在GitHub、Stack Overflow、V2EX还有Slack上的那种看似随机又有规律还不重样的默认头像。一般的,如果你在一个网站注册后没有指定自己的头像,网站会使用 Gravatar 或者 Identicon 作为你的默认头像。Gravatar 大多都是千篇一律,Identicon 却千姿百态。
原理wiki 上说,最初的 Identicon,通常是将用户的IP地址哈希成可视化的,由9块图像构成的图形,服务器通过 Identicon,就能够以头像的形式来分辨用户,这种方法同时也能保护用户的隐私。后来,由第三方将其表现形式扩展至了各种图形,于是就有了大家看到的不同风格的 Identicon 头像。
实现拿 Github 来说吧,在 GitHub 的 Blog 上有对 Identicon 过程做了简单的介绍,他们是将用户的ID取哈希值,然后根据哈希值每一位的奇偶来决定对应位置上的像素的开关。这样生成 的图像,配上由哈希值决定的颜色,保证可生成大量独一无二的图像。有个 Mathematica 的实现,感兴趣的戳。

附Bitmap实现代码
public BitmapSource GenerateIdenticon(Object value)
{
    int width = 9;
    int height = width;
    int stride = (PixelFormats.Indexed8.BitsPerPixel * width) / 8;
    byte[] pixels = new byte[height * stride];
    int hash = value.GetHashCode();
 
    BitmapPalette myPalette = new BitmapPalette(new Color[] { Colors.White, Colors.LightGray, Colors.LightSeaGreen, Colors.White });
 
    for (int y = 0; y < 5; ++y)
     for (int x = y; x < 5; ++x)
     {
         byte color = (byte)(hash & 0x03);
        hash >>= 2;
 
        // II quadrant
        pixels[x + (y * stride)] = color;
        pixels[y + (x * stride)] = color;
 
        // I quadrant
        pixels[(8 - x) + (y * stride)] = color;
        pixels[(8 - y) + (x * stride)] = color;
 
        // III quadrant
        pixels[x + ((8 - y) * stride)] = color;
        pixels[y + ((8 - x) * stride)] = color;
 
        // IV quadrant
        pixels[(8 - x) + ((8 - y) * stride)] = color;
        pixels[(8 - y) + ((8 - x) * stride)] = color;
     }
 
    return BitmapSource.Create(width, height, 96, 96, PixelFormats.Indexed8, myPalette, pixels, stride);
}
posted on 2018-05-19 10:33 Ying-er 阅读(721) 评论(0)  编辑  收藏 所属分类: .Net

只有注册用户登录后才能发表评论。


网站导航: