使用c#生成Identicon图片
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
使用c#生成Identicon图片的更多相关文章
- java web学习总结(九) -------------------通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- RoundedBitmapDrawable生成圆角图片
Bitmap src = BitmapFactory.decodeResource(getResources(), imageId); //获取Bitmap图片 RoundedBitmapDrawab ...
- IOS 截取图片 部分 并生成新图片
/** * 从图片中按指定的位置大小截取图片的一部分 * * @param image UIImage image 原始的图片 * @param rect CGRect rect 要截取的区域 * * ...
- .NET使用ZXing.NET生成中间带图片的二维码
很久之前就有写这样的代码了,只是一直没记录下来,偶然想写成博客. 把之前的代码封装成函数,以方便理解以及调用. 基于开源的 ZXing.NET 组件,代码如下: 先添加对ZXing.NET的引用,然后 ...
- JavaWeb---总结(九)通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl. ...
- Java 生成验证码图片
生成验证码图片并对提交的输入进行验证 // HttpServletResponse常见应用——生成验证码 // 利用BufferedImage类生产随机图片 public static final i ...
- [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件
7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实 ...
- javaweb学习总结(九)—— 通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- 012. asp.net生成验证码图片(汉字示例/字母+数字)
protected void Page_Load(object sender, EventArgs e) { //生成验证码图片的基本步骤 string checkCode = "新年快乐& ...
随机推荐
- if/else语句匹配问题
1: if(*FixedMode == LNG_OUT_FIXED_AMOUNT){ 2: if(NumTemp > MIN_FIXED_AMOUNT && NumTemp &l ...
- 【每天一个Linux命令】10. 用户账号的新建/修改/删除以及密码修改 useradd/usemod/userdel/passwd
在 Linux 系统中,与用户管理有关的文件主要有如下几个:分别是/etc/passwd,/etc/shadow,/etc/gfoup,/etc/gshadow .它们分别与用户的账号,密码,用户组及 ...
- VB操作Excel
在工程中添加引用:Microsoft Office 9.0 Object Library Microsoft Excel 9.0 Object Library ...
- SqlLite ---.net连接数据库
初识SqlLite ---.net连接数据库 SqlLite以小巧和嵌入式闻名,以前只是听说,现在终于忍不住要尝试下. 先下载ADO.NET2.0 Provider for SQLite,下载完后 ...
- JavaScript 要点(十四)HTML DOM 元素(节点)
A.创建新的 HTML 元素 如需向 HTML DOM 添加新元素,必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素. <div id="div1"> ...
- 如何使用validate.js进行动态添加和移除表单验证信息
表单是我们在开当中的常客,那么对表单的验证也是必须的,那么如何实现动态给表单添加验证规则呢? 方法: 1,动态添加验证规则 // 添加$("#addConnectUser").ru ...
- cocos2d-x Animation
转自:http://codingnow.cn/cocos2d-x/810.html 这一篇来学习怎么使用cocos2d-x引擎播放帧动画,就是把一帧一帧的图片像电影那样显示出来.1. 首先来了解一下相 ...
- 感动前行——给医学媳妇写的演讲稿(非IT类)
感动前行 我是一个平庸的人,走在人群中大家可能不能辨别出我.我是一个平庸的人,每天上班.工作.吃饭.睡觉.我是一个平庸的人,来了医院多半年也仅仅和检验科的同事相对照较熟悉,其它科室人员非常少有交流. ...
- PCL入门—点云操作 定义变量 显示点云 存储
// 定义相关变量 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr (new pcl::PointCloud<pcl::PointXYZ& ...
- mysql-connector-python
wget http://cdn.mysql.com//Downloads/Connector-Python/mysql-connector-python-2.1.3.tar.gz tar mysql- ...