Identicon是什么
我們在站點注冊的時候通常系統會在我們沒有提供自定義頭像時為我們指定一個默認的頭像,不過,樣子千篇一律很是難看。聰明的程序員想了很多辦法來解決這個問題,比如你能在這里看到很漂亮的系統自動生成頭像,人們把這東西稱作identicons。 目前能找到的版本大多數是php、ruby或者python的,於是謀生了翻譯一個c#版本的想法。
原理
原理很簡單。假設我們就是想要描繪出github上那種默認的頭像,容易發現那是一個5×5的點陣。有的方塊有顏色有的則沒有(就是背景色了),這像極了二進制的01。對,是1我們就為小方塊着上色彩,是0的話就不管它。可是這個01值從哪兒來?很快又能想到在系統中每個用戶可以有一個唯一值來標識自己(這可能是db中自增長的id,也可能是用戶登錄時的ip地址)。拿到這個唯一值(或者hash一下),我們按順序依次遍歷,並根據每一個char的奇偶情況來決定是否描繪出這樣一個小方塊。對,就是這樣!
一些小細節
- 你能看到上面的思路跟wiki上的說法略有出入,其實無所謂的。identicon的定義並不是那樣的嚴格,能方便找到一個唯一值進行計算的話,hash這個步驟可以省略
- 生成的圖片是對稱的(不對稱也沒關系,但可能就不是太美觀了)
我已經翻譯完畢
https://bitbucket.org/pinopino/aspnetidenticon/overview,感興趣的同學clone一個下來玩玩吧。
使用方式現在還有些別扭,你需要先訪問:
http://your-local-address/identiconhandler/handler.ashx?data=your-data-here
比如我在自己本地測試時用的這個鏈接:http://localhost:3123/identiconhandler/Handler.ashx?data=pinopino,意思還是很清晰的,我想要為pinopino這個用戶生成一個indeticon。變通下這里你還可以傳遞pinopino的id,或者pinopino的ip地址等等都可以。上面的鏈接訪問完畢,站點的根目錄下會生成一張名為“user_001.png”的圖片(寫死掉了,誒嘿~ <ゝω·),於是你可以訪問:
http://your-local-address/identiconhandler/default.aspx
我自己本地測試時訪問:http://localhost:3123/identiconhandler/Default.aspx,效果圖嘛,就像下面這樣:
還是挺漂亮的不是 :)
改進
- 具體的代碼中還有不少可以優化改進的地方
- 使用方式上,現在這樣別扭的方式主要應用場景應該還是比如說用戶注冊時為用戶即時生成一個默認的用戶頭像。一些小的個人站點由於空間的限制可能沒法這樣大手筆的生成。於是,你可以改改代碼,用戶訪問站點時在內存中生成好img然后將stream指向response.OutputStream。算是用時間換空間吧,必要的話還可以加上緩存(當然緩存這東西消耗的雖然不是硬盤但是內存的大小你也得考慮)。嘛,總之,選擇一個最適合自己站點情況的方案才是王道。
- 意見,建議或者發現了bug,請務必告訴我哦,你可以通過項目地址上的issue或者直接博客留言。
ps:
有同學問我說為啥用bitbucket,嘛,一個是這貨支持私有項目托管,第二就是鏈接狀況比較良好上傳下載都挺快的,看個人合適的。
參考鏈接:
http://en.wikipedia.org/wiki/Identicon
https://github.com/blog/1586-identicons