How ot use:
- call from the browser: identicon.html?id=[email protected]
How ot use:
| <html> | |
| <head> | |
| <title>Github style identicon generator </title> | |
| <style> | |
| body { background: #333 } | |
| canvas { margin: 1em } | |
| </style> | |
| <script src="http://www.myersdaily.org/joseph/javascript/md5.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| /* | |
| * Get query value from the url | |
| */ | |
| function getQueryVariable(variable) { | |
| var query = window.location.search.substring(1); | |
| var vars = query.split("&"); | |
| for (var i=0;i<vars.length;i++) { | |
| var pair = vars[i].split("="); | |
| if (pair[0] == variable) { | |
| return pair[1]; | |
| } | |
| } | |
| } | |
| (function() { | |
| // Max value for a color component | |
| var MAX_COLOR = 200; | |
| // Min value for a color component | |
| var MIN_COLOR = 120; | |
| // Chance of a square being filled [0, 1] | |
| var FILL_CHANCE = 0.5; | |
| // Size of a grid square in pixels | |
| var SQUARE = 16; | |
| // Number of squares width and height | |
| var GRID = 5; | |
| // Padding on the edge of the canvas in px | |
| var PADDING = SQUARE/2; | |
| // Size of the canvas | |
| var SIZE = SQUARE*GRID+PADDING*2; | |
| // Generated content (with default value) | |
| var DATA = 'fc5e038d38a57032085441e7fe7010b0'; | |
| /* | |
| * Setup a context and size for a canvas | |
| */ | |
| var setupCanvas = function(c) { | |
| var ctx = c.getContext('2d'); | |
| c.width = SIZE; | |
| c.height = SIZE; | |
| return ctx; | |
| }; | |
| /* | |
| * Fill in a square on the canvas. | |
| */ | |
| var fillBlock = function(x, y, color, ctx) { | |
| ctx.beginPath(); | |
| ctx.rect( | |
| PADDING+x*SQUARE, | |
| PADDING+y*SQUARE, | |
| SQUARE, | |
| SQUARE | |
| ); | |
| ctx.fillStyle = 'rgb('+color.join(',')+')'; | |
| ctx.fill(); | |
| }; | |
| /* | |
| * Pick random squares to fill in. | |
| */ | |
| var generateIdenticon = function(ctx) { | |
| // FILL CANVAS BG | |
| ctx.beginPath(); | |
| ctx.rect(0, 0, SIZE, SIZE); | |
| ctx.fillStyle = '#F0ECE6'; | |
| ctx.fill(); | |
| // GENERATE COLOR | |
| var color = genColor(); | |
| // FILL THE SQUARES | |
| for (var x=0; x<Math.ceil(GRID/2); x++) { | |
| for (var y=0; y<GRID; y++) { | |
| // CALCULATE HASH POSITION | |
| var position = ((GRID * x) + y); | |
| // IF POSITION OVER INDEXING THE HASH, BEGIN OVER AGAIN | |
| if (position > DATA.length){ | |
| position = position - DATA.length; | |
| } | |
| var actual = parseInt(DATA[position],16) | |
| if (actual < (FILL_CHANCE * 16)) { | |
| fillBlock(x, y, color, ctx); | |
| // FILL RIGHT SIDE SYMMETRICALLY | |
| if (x < Math.floor(GRID/2)) { | |
| fillBlock((GRID-1) - x, y, color, ctx); | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| /* | |
| * Get a color with low saturation. | |
| */ | |
| var genColor = function() { | |
| var rgb = [ ]; | |
| for (var i=0; i<3; i++) { | |
| var val = Math.floor(parseInt(DATA[i],16) * 16); | |
| var minEnforced = Math.max(MIN_COLOR, val); | |
| var maxEnforced = Math.min(MAX_COLOR, minEnforced); | |
| rgb.push(maxEnforced); | |
| } | |
| return rgb; | |
| }; | |
| var render = function() { | |
| // GET THE IDENTIFIER? AND CALCULATE THE HASH | |
| var id = getQueryVariable('id'); | |
| if (id != null){ | |
| var hash = md5(id.toLowerCase()); | |
| DATA = hash; | |
| } | |
| generateIdenticon(context2d); | |
| }; | |
| // SETUP THE CANVAS AND DRAWING CONTEXT | |
| var canvas = document.createElement('canvas'); | |
| var context2d = setupCanvas(canvas); | |
| document.body.appendChild(canvas); | |
| render(); | |
| })(); | |
| </script> | |
| </body> | |
| </html> |
Cool :)