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. [置顶] [BZOJ]2127: happiness 最小割

    happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...

  2. POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交

    题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...

  3. 让Visual Studio 2015 支持ASP.NET MVC4.0.0.1

    近日装上了Visual Studio 2015 ,打开之前vs2013创建的MVC4的项目发现无法编译通过,提示System.Web.MVC,System.Web.WebPages 等找不到,网上搜索 ...

  4. ThinkPHP3.1快速入门(12)自动验证

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 验证规则 数据验证可以进行数据类型.业务规则.安全判断等方面的验证操作.数据验证有两 ...

  5. C++容器类对象函数參数问题

    总之中的一个句话:容器类对象作为函数參数,与整数类型作为函数參数的传递特性同样. 验证程序 #include "stdafx.h" #include <iostream> ...

  6. SQL索引详解

    转自:http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可 ...

  7. Twenty Newsgroups Classification任务之二seq2sparse(3)

    接上篇,如果想对上篇的问题进行测试其实可以简单的编写下面的代码: package mahout.fansy.test.bayes.write; import java.io.IOException; ...

  8. mha日常维护命令

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

  9. [006]为什么C++会被叫做是C++?

    先了解一下自增和自减的运算符: 自增(++)和自减(--)操作符为对象提供加1或减1操作: int i = 0, j; j = ++i; // j = 1, i = 1: prefix yields ...

  10. 类 ArrayBlockingQueue<E>(一个由数组支持的有界阻塞队列。)

    类型参数: E - 在此 collection 中保持的元素类型 所有已实现的接口: Serializable, Iterable<E>, Collection<E>, Blo ...