概述Identicon 是 Don Park 在2007年首次想出的。也許有些人對“Identicon”這詞比較陌生,其實大家都認識的——就是在GitHub、Stack Overflow、V2EX還有Slack上的那種看似隨機又有規(guī)律還不重樣的默認頭像。一般的,如果你在一個網(wǎng)站注冊后沒有指定自己的頭像,網(wǎng)站會使用 Gravatar 或者 Identicon 作為你的默認頭像。Gravatar 大多都是千篇一律,Identicon 卻千姿百態(tài)。
          原理wiki 上說,最初的 Identicon,通常是將用戶的IP地址哈希成可視化的,由9塊圖像構(gòu)成的圖形,服務(wù)器通過 Identicon,就能夠以頭像的形式來分辨用戶,這種方法同時也能保護用戶的隱私。后來,由第三方將其表現(xiàn)形式擴展至了各種圖形,于是就有了大家看到的不同風(fēng)格的 Identicon 頭像。
          實現(xiàn)拿 Github 來說吧,在 GitHub 的 Blog 上有對 Identicon 過程做了簡單的介紹,他們是將用戶的ID取哈希值,然后根據(jù)哈希值每一位的奇偶來決定對應(yīng)位置上的像素的開關(guān)。這樣生成 的圖像,配上由哈希值決定的顏色,保證可生成大量獨一無二的圖像。有個 Mathematica 的實現(xiàn),感興趣的戳。

          附Bitmap實現(xiàn)代碼
          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 閱讀(771) 評論(0)  編輯  收藏 所屬分類: .Net
          主站蜘蛛池模板: 红桥区| 东港市| 庆安县| 伊宁县| 蒲江县| 盘山县| 苏州市| 东兰县| 元朗区| 万宁市| 两当县| 桦川县| 汝州市| 墨竹工卡县| 沈阳市| 登封市| 乐昌市| 蓬安县| 兴山县| 蒙山县| 简阳市| 四会市| 金溪县| 朔州市| 西乌| 沅江市| 隆子县| 清丰县| 乡宁县| 天柱县| 建湖县| 鹤岗市| 黎平县| 界首市| 黔西县| 沽源县| 抚州市| 珠海市| 耿马| 临朐县| 香格里拉县|