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. 问题-WIN7 ..\Bin\InitCC32.exe".进程无法访问(拒绝访问)

    问题现象: 问题原因:是InitCC32.exe没有权限. 问题处理:在DELPHI7的安装目录里设置用户权限,加入EVE... 这个用户.

  2. [C语言 - 13] 运算符

    算术运算符 运算符的优先级 括号 > 正负 > 数学运算 > 位运算 > 数学对比 > 逻辑对比 > 条件运算 > 赋值运算   A.赋值运算符 复合赋值运算 ...

  3. .NET设计模式(3):抽象工厂模式(Abstract Factory)

    ):抽象工厂模式(Abstract Factory) 抽象工厂模式(Abstract Factory) --探索设计模式系列之三 Terrylee,2005年12月12日 转载:http://terr ...

  4. 针对 .NET 框架的安全编码指南

      此主题尚未评级 - 评价此主题 发布日期 : 10/9/2004 | 更新日期 : 10/9/2004 Microsoft Corporation 适用于: Microsoft .NET 框架 摘 ...

  5. EF如何正确的进行实体中修改

    本文转载:http://www.cnblogs.com/Ruiky/archive/2012/12/29/2839011.html 不推荐方式一: 思路:先从ObjectContext取出实体,然后将 ...

  6. C#基础知识之方法重载总结

    1.首先解释一下什么是方法重载?    方法重载是指在同一个类中方法同名,参数不同,调用时根据实参的形式,选择与他匹配的方法执行操作的一种技术. 这里所说的参数不同是指以下几种情况: ①  参数的类型 ...

  7. android常见错误-

    将library中的报错项删除,然后点击[add]正确的appcompat

  8. C#-设置窗体在显示器居中显示

    在窗体的属性中查看:StartPosition属性,该属性的设置中有一个"CenterScreen"的选择项,该项就是设置窗体局中显示的.

  9. Android中Socket大文件断点上传

    原文:http://blog.csdn.net/shimiso/article/details/8529633 什么是Socket? 所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一 ...

  10. android学习日记06--View视图

    一.android 界面开发 1.三个重要的类:View视图.Canvas画布.Paint画笔2.android 界面开发常用三种视图 View            --只能在主线程中更新,没有缓存 ...