Advertisement
imoda

base64 encoded identicon

Apr 11th, 2012
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.19 KB | None | 0 0
  1.     function identicon($stringToHash, $size = 32, $alt = '') {
  2.        
  3.         $hash = md5($stringToHash);
  4.        
  5.         $csh=hexdec(substr($hash,0,1)); // corner sprite shape
  6.         $ssh=hexdec(substr($hash,1,1)); // side sprite shape
  7.         $xsh=hexdec(substr($hash,2,1))&7; // center sprite shape
  8.        
  9.         $cro=hexdec(substr($hash,3,1))&3; // corner sprite rotation
  10.         $sro=hexdec(substr($hash,4,1))&3; // side sprite rotation
  11.         $xbg=hexdec(substr($hash,5,1))%2; // center sprite background
  12.        
  13.         /* corner sprite foreground color */
  14.         $cfr=hexdec(substr($hash,6,2));
  15.         $cfg=hexdec(substr($hash,8,2));
  16.         $cfb=hexdec(substr($hash,10,2));
  17.        
  18.         /* side sprite foreground color */
  19.         $sfr=hexdec(substr($hash,12,2));
  20.         $sfg=hexdec(substr($hash,14,2));
  21.         $sfb=hexdec(substr($hash,16,2));
  22.        
  23.         /* final angle of rotation */
  24.         $angle=hexdec(substr($hash,18,2));
  25.        
  26.         /* size of each sprite */
  27.         $spriteZ=128;
  28.        
  29.         /* start with blank 3x3 identicon */
  30.         $identicon=imagecreatetruecolor($spriteZ*3,$spriteZ*3);
  31.         imageantialias($identicon,TRUE);
  32.        
  33.         /* assign white as background */
  34.         $bg=imagecolorallocate($identicon,255,255,255);
  35.         imagefilledrectangle($identicon,0,0,$spriteZ,$spriteZ,$bg);
  36.        
  37.         /* generate corner sprites */
  38.         $corner=getsprite($spriteZ,$csh,$cfr,$cfg,$cfb,$cro);
  39.         imagecopy($identicon,$corner,0,0,0,0,$spriteZ,$spriteZ);
  40.         $corner=imagerotate($corner,90,$bg);
  41.         imagecopy($identicon,$corner,0,$spriteZ*2,0,0,$spriteZ,$spriteZ);
  42.         $corner=imagerotate($corner,90,$bg);
  43.         imagecopy($identicon,$corner,$spriteZ*2,$spriteZ*2,0,0,$spriteZ,$spriteZ);
  44.         $corner=imagerotate($corner,90,$bg);
  45.         imagecopy($identicon,$corner,$spriteZ*2,0,0,0,$spriteZ,$spriteZ);
  46.        
  47.         /* generate side sprites */
  48.         $side=getsprite($spriteZ,$ssh,$sfr,$sfg,$sfb,$sro);
  49.         imagecopy($identicon,$side,$spriteZ,0,0,0,$spriteZ,$spriteZ);
  50.         $side=imagerotate($side,90,$bg);
  51.         imagecopy($identicon,$side,0,$spriteZ,0,0,$spriteZ,$spriteZ);
  52.         $side=imagerotate($side,90,$bg);
  53.         imagecopy($identicon,$side,$spriteZ,$spriteZ*2,0,0,$spriteZ,$spriteZ);
  54.         $side=imagerotate($side,90,$bg);
  55.         imagecopy($identicon,$side,$spriteZ*2,$spriteZ,0,0,$spriteZ,$spriteZ);
  56.        
  57.         /* generate center sprite */
  58.         $center=getcenter($spriteZ,$xsh,$cfr,$cfg,$cfb,$sfr,$sfg,$sfb,$xbg);
  59.         imagecopy($identicon,$center,$spriteZ,$spriteZ,0,0,$spriteZ,$spriteZ);
  60.        
  61.         // $identicon=imagerotate($identicon,$angle,$bg);
  62.        
  63.         /* make white transparent */
  64.         imagecolortransparent($identicon,$bg);
  65.        
  66.         /* create blank image according to specified dimensions */
  67.         $resized=imagecreatetruecolor($size,$size);
  68.         imageantialias($resized,TRUE);
  69.        
  70.         /* assign white as background */
  71.         $bg=imagecolorallocate($resized,255,255,255);
  72.         imagefilledrectangle($resized,0,0,$size,$size,$bg);
  73.        
  74.         /* resize identicon according to specification */
  75.         imagecopyresampled($resized,$identicon,0,0,(imagesx($identicon)-$spriteZ*3)/2,(imagesx($identicon)-$spriteZ*3)/2,$size,$size,$spriteZ*3,$spriteZ*3);
  76.        
  77.         /* make white transparent */
  78.         imagecolortransparent($resized,$bg);
  79.        
  80.         ob_start();
  81.         imagepng($resized);
  82.         $image = ob_get_clean();
  83.        
  84.         return '<img src="data:image/png;base64,' . base64_encode($image) .
  85.             '" alt="' . $alt .
  86.             '"' . (!empty($alt) ? ' title="' . $alt . '"' : '') .
  87.             ' width="' . $size . '" height="' . $size . '" />';
  88.            
  89.         imagedestroy($resized);
  90.     }
  91.  
  92.     function getsprite($spriteZ,$shape,$R,$G,$B,$rotation) {
  93.         $sprite=imagecreatetruecolor($spriteZ,$spriteZ);
  94.         imageantialias($sprite,TRUE);
  95.         $fg=imagecolorallocate($sprite,$R,$G,$B);
  96.         $bg=imagecolorallocate($sprite,255,255,255);
  97.         imagefilledrectangle($sprite,0,0,$spriteZ,$spriteZ,$bg);
  98.         switch($shape) {
  99.             case 0: // triangle
  100.                 $shape=array(
  101.                     0.5,1,
  102.                     1,0,
  103.                     1,1
  104.                 );
  105.                 break;
  106.             case 1: // parallelogram
  107.                 $shape=array(
  108.                     0.5,0,
  109.                     1,0,
  110.                     0.5,1,
  111.                     0,1
  112.                 );
  113.                 break;
  114.             case 2: // mouse ears
  115.                 $shape=array(
  116.                     0.5,0,
  117.                     1,0,
  118.                     1,1,
  119.                     0.5,1,
  120.                     1,0.5
  121.                 );
  122.                 break;
  123.             case 3: // ribbon
  124.                 $shape=array(
  125.                     0,0.5,
  126.                     0.5,0,
  127.                     1,0.5,
  128.                     0.5,1,
  129.                     0.5,0.5
  130.                 );
  131.                 break;
  132.             case 4: // sails
  133.                 $shape=array(
  134.                     0,0.5,
  135.                     1,0,
  136.                     1,1,
  137.                     0,1,
  138.                     1,0.5
  139.                 );
  140.                 break;
  141.             case 5: // fins
  142.                 $shape=array(
  143.                     1,0,
  144.                     1,1,
  145.                     0.5,1,
  146.                     1,0.5,
  147.                     0.5,0.5
  148.                 );
  149.                 break;
  150.             case 6: // beak
  151.                 $shape=array(
  152.                     0,0,
  153.                     1,0,
  154.                     1,0.5,
  155.                     0,0,
  156.                     0.5,1,
  157.                     0,1
  158.                 );
  159.                 break;
  160.             case 7: // chevron
  161.                 $shape=array(
  162.                     0,0,
  163.                     0.5,0,
  164.                     1,0.5,
  165.                     0.5,1,
  166.                     0,1,
  167.                     0.5,0.5
  168.                 );
  169.                 break;
  170.             case 8: // fish
  171.                 $shape=array(
  172.                     0.5,0,
  173.                     0.5,0.5,
  174.                     1,0.5,
  175.                     1,1,
  176.                     0.5,1,
  177.                     0.5,0.5,
  178.                     0,0.5
  179.                 );
  180.                 break;
  181.             case 9: // kite
  182.                 $shape=array(
  183.                     0,0,
  184.                     1,0,
  185.                     0.5,0.5,
  186.                     1,0.5,
  187.                     0.5,1,
  188.                     0.5,0.5,
  189.                     0,1
  190.                 );
  191.                 break;
  192.             case 10: // trough
  193.                 $shape=array(
  194.                     0,0.5,
  195.                     0.5,1,
  196.                     1,0.5,
  197.                     0.5,0,
  198.                     1,0,
  199.                     1,1,
  200.                     0,1
  201.                 );
  202.                 break;
  203.             case 11: // rays
  204.                 $shape=array(
  205.                     0.5,0,
  206.                     1,0,
  207.                     1,1,
  208.                     0.5,1,
  209.                     1,0.75,
  210.                     0.5,0.5,
  211.                     1,0.25
  212.                 );
  213.                 break;
  214.             case 12: // double rhombus
  215.                 $shape=array(
  216.                     0,0.5,
  217.                     0.5,0,
  218.                     0.5,0.5,
  219.                     1,0,
  220.                     1,0.5,
  221.                     0.5,1,
  222.                     0.5,0.5,
  223.                     0,1
  224.                 );
  225.                 break;
  226.             case 13: // crown
  227.                 $shape=array(
  228.                     0,0,
  229.                     1,0,
  230.                     1,1,
  231.                     0,1,
  232.                     1,0.5,
  233.                     0.5,0.25,
  234.                     0.5,0.75,
  235.                     0,0.5,
  236.                     0.5,0.25
  237.                 );
  238.                 break;
  239.             case 14: // radioactive
  240.                 $shape=array(
  241.                     0,0.5,
  242.                     0.5,0.5,
  243.                     0.5,0,
  244.                     1,0,
  245.                     0.5,0.5,
  246.                     1,0.5,
  247.                     0.5,1,
  248.                     0.5,0.5,
  249.                     0,1
  250.                 );
  251.                 break;
  252.             default: // tiles
  253.                 $shape=array(
  254.                     0,0,
  255.                     1,0,
  256.                     0.5,0.5,
  257.                     0.5,0,
  258.                     0,0.5,
  259.                     1,0.5,
  260.                     0.5,1,
  261.                     0.5,0.5,
  262.                     0,1
  263.                 );
  264.                 break;
  265.         }
  266.         /* apply ratios */
  267.         for ($i=0;$i<count($shape);$i++)
  268.             $shape[$i]=$shape[$i]*$spriteZ;
  269.         imagefilledpolygon($sprite,$shape,count($shape)/2,$fg);
  270.         /* rotate the sprite */
  271.         for ($i=0;$i<$rotation;$i++)
  272.             $sprite=imagerotate($sprite,90,$bg);
  273.         return $sprite;
  274.     }
  275.    
  276.     /* generate sprite for center block */
  277.     function getcenter($spriteZ,$shape,$fR,$fG,$fB,$bR,$bG,$bB,$usebg) {
  278.         $sprite=imagecreatetruecolor($spriteZ,$spriteZ);
  279.         imageantialias($sprite,TRUE);
  280.         $fg=imagecolorallocate($sprite,$fR,$fG,$fB);
  281.         /* make sure there's enough contrast before we use background color of side sprite */
  282.         if ($usebg>0 && (abs($fR-$bR)>127 || abs($fG-$bG)>127 || abs($fB-$bB)>127))
  283.             $bg=imagecolorallocate($sprite,$bR,$bG,$bB);
  284.         else
  285.             $bg=imagecolorallocate($sprite,255,255,255);
  286.         imagefilledrectangle($sprite,0,0,$spriteZ,$spriteZ,$bg);
  287.         switch($shape) {
  288.             case 0: // empty
  289.                 $shape=array();
  290.                 break;
  291.             case 1: // fill
  292.                 $shape=array(
  293.                     0,0,
  294.                     1,0,
  295.                     1,1,
  296.                     0,1
  297.                 );
  298.                 break;
  299.             case 2: // diamond
  300.                 $shape=array(
  301.                     0.5,0,
  302.                     1,0.5,
  303.                     0.5,1,
  304.                     0,0.5
  305.                 );
  306.                 break;
  307.             case 3: // reverse diamond
  308.                 $shape=array(
  309.                     0,0,
  310.                     1,0,
  311.                     1,1,
  312.                     0,1,
  313.                     0,0.5,
  314.                     0.5,1,
  315.                     1,0.5,
  316.                     0.5,0,
  317.                     0,0.5
  318.                 );
  319.                 break;
  320.             case 4: // cross
  321.                 $shape=array(
  322.                     0.25,0,
  323.                     0.75,0,
  324.                     0.5,0.5,
  325.                     1,0.25,
  326.                     1,0.75,
  327.                     0.5,0.5,
  328.                     0.75,1,
  329.                     0.25,1,
  330.                     0.5,0.5,
  331.                     0,0.75,
  332.                     0,0.25,
  333.                     0.5,0.5
  334.                 );
  335.                 break;
  336.             case 5: // morning star
  337.                 $shape=array(
  338.                     0,0,
  339.                     0.5,0.25,
  340.                     1,0,
  341.                     0.75,0.5,
  342.                     1,1,
  343.                     0.5,0.75,
  344.                     0,1,
  345.                     0.25,0.5
  346.                 );
  347.                 break;
  348.             case 6: // small square
  349.                 $shape=array(
  350.                     0.33,0.33,
  351.                     0.67,0.33,
  352.                     0.67,0.67,
  353.                     0.33,0.67
  354.                 );
  355.                 break;
  356.             case 7: // checkerboard
  357.                 $shape=array(
  358.                     0,0,
  359.                     0.33,0,
  360.                     0.33,0.33,
  361.                     0.66,0.33,
  362.                     0.67,0,
  363.                     1,0,
  364.                     1,0.33,
  365.                     0.67,0.33,
  366.                     0.67,0.67,
  367.                     1,0.67,
  368.                     1,1,
  369.                     0.67,1,
  370.                     0.67,0.67,
  371.                     0.33,0.67,
  372.                     0.33,1,
  373.                     0,1,
  374.                     0,0.67,
  375.                     0.33,0.67,
  376.                     0.33,0.33,
  377.                     0,0.33
  378.                 );
  379.                 break;
  380.         }
  381.         /* apply ratios */
  382.         for ($i=0;$i<count($shape);$i++)
  383.             $shape[$i]=$shape[$i]*$spriteZ;
  384.         if (count($shape)>0)
  385.             imagefilledpolygon($sprite,$shape,count($shape)/2,$fg);
  386.         return $sprite;
  387.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement