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图片的更多相关文章

  1. java web学习总结(九) -------------------通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  2. RoundedBitmapDrawable生成圆角图片

    Bitmap src = BitmapFactory.decodeResource(getResources(), imageId); //获取Bitmap图片 RoundedBitmapDrawab ...

  3. IOS 截取图片 部分 并生成新图片

    /** * 从图片中按指定的位置大小截取图片的一部分 * * @param image UIImage image 原始的图片 * @param rect CGRect rect 要截取的区域 * * ...

  4. .NET使用ZXing.NET生成中间带图片的二维码

    很久之前就有写这样的代码了,只是一直没记录下来,偶然想写成博客. 把之前的代码封装成函数,以方便理解以及调用. 基于开源的 ZXing.NET 组件,代码如下: 先添加对ZXing.NET的引用,然后 ...

  5. JavaWeb---总结(九)通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片  1 package gacl. ...

  6. Java 生成验证码图片

    生成验证码图片并对提交的输入进行验证 // HttpServletResponse常见应用——生成验证码 // 利用BufferedImage类生产随机图片 public static final i ...

  7. [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件

    7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实 ...

  8. javaweb学习总结(九)—— 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  9. 012. asp.net生成验证码图片(汉字示例/字母+数字)

    protected void Page_Load(object sender, EventArgs e) { //生成验证码图片的基本步骤 string checkCode = "新年快乐& ...

随机推荐

  1. python 面向对象高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念.

  2. 新浪新闻API接口

    头条 http://api.sina.cn/sinago/list.json?channel=news_toutiao推荐 http://api.sina.cn/sinago/list.json?ch ...

  3. iOS 应用数据存储的常用方式

    iOS 开发中,经常会有将数据存储到本地的需求.比如一些数据的缓存,或者记录下用户的账号密码,记录下下次是否自动登录等,这些都需要将数据记录到本地.iOS中,数据存储到本地的常见方式有三种: 一: 使 ...

  4. 两个简单方法加速DataGridView

    两个简单方法加速DataGridView (2009-03-24 16:57:13) 转载▼ 标签: 杂谈 分类: .NET DataGridView虽然好用,但是如果数据量比较大的话就会出现性能的问 ...

  5. PHP函数ip2long转换IP时数值太大产生负数的解决办法

    有两种办法: 1. bindec( decbin($long))  利用bindec和decbin两个函数转换一次就没有问题了 我一直在用上面的方法,但是在升级到PHP7以后就不起作用了(因为最近只进 ...

  6. Nginx加多个tomcat实现负载均衡,动静分离

    一:Nginx+Tomcat的动静分离 所谓动静分离就是通过nginx(或apache等)来处理用户端请求的图片.html等静态的文件,tomcat(或weblogic)处理jsp.do等动态文件,从 ...

  7. android学习日记03--常用控件progressbar/seekbar

    常用控件 5.progressbar 进度条,比较常用的组件,在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度.一个进度条也 ...

  8. mha日常维护命令

    mha日常维护命令 http://m.blog.chinaunix.net/uid-28437434-id-3959021.html?/13033.shtml 1.查看ssh登陆是否成功masterh ...

  9. 【转】Singleton单例模式

    对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器. ...

  10. iOS开发之OCR光学识别储蓄卡以及信用卡

    最近由于公司需要一个扫描银行卡获取卡号的功能,网上找了很多相关的资料,完全扫描银行卡获取卡号信息的都是价格贵的不得了的,而且仅仅只是授权而已,在此咱退而求次,找到一个可以扫描信用卡的第三方框架,给大家 ...