使用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 = "新年快乐& ...
随机推荐
- stm32 CAN引脚-笔记
默认: CANRX – > PA11 CANTX - >PA12 映射1: CANRX – > PB8 CANTX - >PB9 映射2: CANRX – > ...
- MSSQLSERVER数据库- LEFT JOIN后面跟着WHERE竟变成内联 解决方法
在LEFT JOIN后面跟着WHERE竟变成内联.百度后看到这个解决方法. 记录如下: select sre.*, co.description from subscribedratingelemen ...
- Android Handler的简单使用
大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ...
- 退出程序是跳过屏幕自检 比如 必输 EXIT-COMMAND
控制必须输入可以,但是我退出程序的时候还要求我输入个值才能退出,这太变态了,相信很多同志都在SAP程序中反感过这个问题. 标准程序咱就不说了,忍了,新开发的功能还是要解决这个问题. 办法很简单:MOD ...
- 教你50招提升ASP.NET性能(二):移除不用的视图引擎
(2)Remove unused View Engines 招数2: 移除不用的视图引擎 If you're an ASP.NET MVC developer, you might not know ...
- SQLMAP实用实例(转)
sqlmap使用笔记:http://wenku.baidu.com/view/8c507ffcaef8941ea76e055e.html BT5下使用SQLMAP入侵加脱裤:http://www.m ...
- IIS连接数
IIS连接数,也叫IIS并发数(Current Connections),是指同一时间内,有多少个对服务器的请求 一般情况下一个浏览器会占用2个IIS连接 同一个浏览器(IE.Firefox等)窗口中 ...
- 安装builderRobot到Rational Functional Tester和Performance Tester
最近研究安装builder,稍微总结一下,以后继续补充: 1. Robot采用专业的测试脚本语言, 从而导致需要学习专门的API以及专门的语法外, 用进程化的Visual Basic作为脚本语言, 导 ...
- 使用Go语言两三事
使用Go语言两三事,在网上看到的总结的很不错哦,转自http://www.cnblogs.com/sevenyuan/archive/2013/02/27/2935887.html 一.channel ...
- Mac联网恢复系统重新安装Lion
Mac的Lion系统,虽然不像Windows那样需要经常重装,但也难免会有要重置的时候,比如更换硬盘.本文介绍如何利用Mac的联网恢复系统进行Lion系统的在线恢复.Mac的在线恢复系统只在近几年的机 ...