function generateIdenticon($iUserId, $iUserImageDefaultSize = 64) { $avatarhash = md5($iUserId); #error_log( "\$avatarhash: $avatarhash" ); $avatarsize = $iUserImageDefaultSize; /* parse hash string */ $csh = hexdec(substr($avatarhash, 0, 1)); // corner sprite shape $ssh = hexdec(substr($avatarhash, 1, 1)); // side sprite shape $xsh = hexdec(substr($avatarhash, 2, 1)) & 7; // center sprite shape $cro = hexdec(substr($avatarhash, 3, 1)) & 3; // corner sprite rotation $sro = hexdec(substr($avatarhash, 4, 1)) & 3; // side sprite rotation $xbg = hexdec(substr($avatarhash, 5, 1)) % 2; // center sprite background /* corner sprite foreground color */ $cfr = hexdec(substr($avatarhash, 6, 2)); $cfg = hexdec(substr($avatarhash, 8, 2)); $cfb = hexdec(substr($avatarhash, 10, 2)); /* side sprite foreground color */ $sfr = hexdec(substr($avatarhash, 12, 2)); $sfg = hexdec(substr($avatarhash, 14, 2)); $sfb = hexdec(substr($avatarhash, 16, 2)); /* final angle of rotation */ $angle = hexdec(substr($avatarhash, 18, 2)); /* size of each sprite */ $spriteZ = 128; /* start with blank 3x3 identicon */ $identicon = imagecreatetruecolor($spriteZ * 3, $spriteZ * 3); imageantialias($identicon, TRUE); /* assign white as background */ $bg = imagecolorallocate($identicon, 255, 255, 255); imagefilledrectangle($identicon, 0, 0, $spriteZ, $spriteZ, $bg); /* generate corner sprites */ $corner = getsprite($csh, $cfr, $cfg, $cfb, $cro, $spriteZ); imagecopy($identicon, $corner, 0, 0, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, 0, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, $spriteZ * 2, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, $spriteZ * 2, 0, 0, 0, $spriteZ, $spriteZ); /* generate side sprites */ $side = getsprite($ssh, $sfr, $sfg, $sfb, $sro, $spriteZ); imagecopy($identicon, $side, $spriteZ, 0, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, 0, $spriteZ, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, $spriteZ, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, $spriteZ * 2, $spriteZ, 0, 0, $spriteZ, $spriteZ); /* generate center sprite */ $center = getcenter($xsh, $cfr, $cfg, $cfb, $sfr, $sfg, $sfb, $xbg, $spriteZ); imagecopy($identicon, $center, $spriteZ, $spriteZ, 0, 0, $spriteZ, $spriteZ); // $identicon=imagerotate($identicon,$angle,$bg); /* make white transparent */ imagecolortransparent($identicon, $bg); /* create blank image according to specified dimensions */ $resized = imagecreatetruecolor($avatarsize, $avatarsize); imageantialias($resized, TRUE); /* assign white as background */ $bg = imagecolorallocate($resized, 255, 255, 255); imagefilledrectangle($resized, 0, 0, $avatarsize, $avatarsize, $bg); /* resize identicon according to specification */ imagecopyresampled($resized, $identicon, 0, 0, (imagesx($identicon) - $spriteZ * 3) / 2, (imagesx($identicon) - $spriteZ * 3) / 2, $avatarsize, $avatarsize, $spriteZ * 3, $spriteZ * 3); /* make white transparent */ imagecolortransparent($resized, $bg); /* and finally, send to standard output */ #header("Content-Type: image/png"); #imagepng($resized); // Enable output buffering ob_start(); // Stream raw PNG image data imagepng($resized); // Capture the output $rawpngidenticon = ob_get_contents(); // Clear the output buffer ob_end_clean(); return $rawpngidenticon; }
$identicon = imagecreatetruecolor($spriteZ * 3, $spriteZ * 3); imageantialias($identicon, TRUE); /* assign white as background */ $bg = imagecolorallocate($identicon, 255, 255, 255); imagefilledrectangle($identicon, 0, 0, $spriteZ, $spriteZ, $bg); /* generate corner sprites */ $corner = getsprite($csh, $cfr, $cfg, $cfb, $cro); imagecopy($identicon, $corner, 0, 0, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, 0, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, $spriteZ * 2, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, $spriteZ * 2, 0, 0, 0, $spriteZ, $spriteZ); /* generate side sprites */ $side = getsprite($ssh, $sfr, $sfg, $sfb, $sro); imagecopy($identicon, $side, $spriteZ, 0, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, 0, $spriteZ, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, $spriteZ, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, $spriteZ * 2, $spriteZ, 0, 0, $spriteZ, $spriteZ); /* generate center sprite */ $center = getcenter($xsh, $cfr, $cfg, $cfb, $sfr, $sfg, $sfb, $xbg); imagecopy($identicon, $center, $spriteZ, $spriteZ, 0, 0, $spriteZ, $spriteZ); // $identicon=imagerotate($identicon,$angle,$bg); /* make white transparent */ imagecolortransparent($identicon, $bg); /* create blank image according to specified dimensions */ $resized = imagecreatetruecolor($_GET["size"], $_GET["size"]);
function identicon($name, $size = 48) { global $spriteZ; /* hash name */ $hash = md5($name); /* parse hash string */ $csh = hexdec(substr($hash, 0, 1)); // corner sprite shape $ssh = hexdec(substr($hash, 1, 1)); // side sprite shape $xsh = hexdec(substr($hash, 2, 1)) & 7; // center sprite shape $cro = hexdec(substr($hash, 3, 1)) & 3; // corner sprite rotation $sro = hexdec(substr($hash, 4, 1)) & 3; // side sprite rotation $xbg = hexdec(substr($hash, 5, 1)) % 2; // center sprite background /* corner sprite foreground color */ $cfr = hexdec(substr($hash, 6, 2)); $cfg = hexdec(substr($hash, 8, 2)); $cfb = hexdec(substr($hash, 10, 2)); /* side sprite foreground color */ $sfr = hexdec(substr($hash, 12, 2)); $sfg = hexdec(substr($hash, 14, 2)); $sfb = hexdec(substr($hash, 16, 2)); /* final angle of rotation */ $angle = hexdec(substr($hash, 18, 2)); /* size of each sprite */ $spriteZ = 128; /* start with blank 3x3 identicon */ $identicon = imagecreatetruecolor($spriteZ * 3, $spriteZ * 3); // imageantialias($identicon,TRUE); /* assign white as background */ $bg = imagecolorallocate($identicon, 255, 255, 255); imagefilledrectangle($identicon, 0, 0, $spriteZ, $spriteZ, $bg); /* generate corner sprites */ $corner = getsprite($csh, $cfr, $cfg, $cfb, $cro); imagecopy($identicon, $corner, 0, 0, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, 0, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, $spriteZ * 2, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $corner = imagerotate($corner, 90, $bg); imagecopy($identicon, $corner, $spriteZ * 2, 0, 0, 0, $spriteZ, $spriteZ); /* generate side sprites */ $side = getsprite($ssh, $sfr, $sfg, $sfb, $sro); imagecopy($identicon, $side, $spriteZ, 0, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, 0, $spriteZ, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, $spriteZ, $spriteZ * 2, 0, 0, $spriteZ, $spriteZ); $side = imagerotate($side, 90, $bg); imagecopy($identicon, $side, $spriteZ * 2, $spriteZ, 0, 0, $spriteZ, $spriteZ); /* generate center sprite */ $center = getcenter($xsh, $cfr, $cfg, $cfb, $sfr, $sfg, $sfb, $xbg); imagecopy($identicon, $center, $spriteZ, $spriteZ, 0, 0, $spriteZ, $spriteZ); $identicon = imagerotate($identicon, $angle, $bg); /* make white transparent */ imagecolortransparent($identicon, $bg); /* create blank image according to specified dimensions */ $resized = imagecreatetruecolor($size, $size); // imageantialias($resized,TRUE); /* assign white as background */ $bg = imagecolorallocate($resized, 255, 255, 255); imagefilledrectangle($resized, 0, 0, $size, $size, $bg); /* resize identicon according to specification */ imagecopyresampled($resized, $identicon, 0, 0, (imagesx($identicon) - $spriteZ * 3) / 2, (imagesx($identicon) - $spriteZ * 3) / 2, $size, $size, $spriteZ * 3, $spriteZ * 3); /* make white transparent */ imagecolortransparent($resized, $bg); /* return image */ return $resized; }