chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; /* Length of a word in an image */ $this->char_length = 4; /* Array of fonts. Randomly picked up per character */ $this->fonts = array( dirname(__FILE__) . '/gentium/GenAI102.TTF', dirname(__FILE__) . '/gentium/GenAR102.TTF', dirname(__FILE__) . '/gentium/GenI102.TTF', dirname(__FILE__) . '/gentium/GenR102.TTF'); /* Directory CAPTCHA image and corresponding code kept temporary */ $this->tmp_dir = dirname(__FILE__) . '/tmp/'; /* Array of CAPTCHA image size. Width and height */ $this->img_size = array(72, 24); /* Background color of CAPTCHA image. RGB color 0-255 */ $this->bg = array(255, 255, 255); /* Foreground (character) color of CAPTCHA image. RGB color 0-255 */ $this->fg = array(0, 0, 0); /* Coordinates for a text in an image. I don't know the meaning. Just adjust. */ $this->base = array(6, 18); /* Font size */ $this->font_size = 14; /* Width of a character */ $this->font_char_width = 15; /* Image type. 'png', 'gif' or 'jpeg' */ $this->img_type = 'png'; /* Mode of temporary files */ $this->file_mode = 0755; } /* Generate and return random word with $chars characters x $char_length length */ function generate_random_word() { $word = ''; for ($i = 0; $i < $this->char_length; $i++) { $pos = mt_rand(0, strlen($this->chars) - 1); $char = $this->chars[$pos]; $word .= $char; } return $word; } /* Generate CAPTCHA code and corresponding code and save them into $tmp_dir directory. $prefix is file prefix for both files. $captcha is a random word usually generated by generate_random_word() This function returns the filename of the CAPTCHA image temporary file */ function generate_image($prefix, $word) { $filename = null; if ($im = imagecreatetruecolor($this->img_size[0], $this->img_size[1])) { $bg = imagecolorallocate($im, $this->bg[0], $this->bg[1], $this->bg[2]); $fg = imagecolorallocate($im, $this->fg[0], $this->fg[1], $this->fg[2]); imagefill($im, 0, 0, $bg); $x = $this->base[0] + mt_rand(-2, 2); for ($i = 0; $i < strlen($word); $i++) { $font = $this->fonts[array_rand($this->fonts)]; imagettftext($im, $this->font_size, mt_rand(-2, 2), $x, $this->base[1] + mt_rand(-2, 2), $fg, $font, $word[$i]); $x += $this->font_char_width; } switch ($this->img_type) { case 'jpeg': $filename = $prefix . '.jpeg'; imagejpeg($im, $this->tmp_dir . $filename); break; case 'gif': $filename = $prefix . '.gif'; imagegif($im, $this->tmp_dir . $filename); break; case 'png': default: $filename = $prefix . '.png'; imagepng($im, $this->tmp_dir . $filename); } imagedestroy($im); @chmod($this->tmp_dir . $filename, $this->file_mode); } if ($fh = fopen($this->tmp_dir . $prefix . '.php', 'w')) { @chmod($this->tmp_dir . $prefix . '.php', $this->file_mode); fwrite($fh, ''); fclose($fh); } return $filename; } /* Check a $response against the code kept in the temporary file with $prefix Return true if the two match, otherwise return false. */ function check($prefix, $response) { if (is_readable($this->tmp_dir . $prefix . '.php')) { include($this->tmp_dir . $prefix . '.php'); if (0 == strcasecmp($response, $captcha)) return true; } return false; } /* Remove temporary files with $prefix */ function remove($prefix) { $suffixes = array('.jpeg', '.gif', '.png', '.php'); foreach ($suffixes as $suffix) { $file = $this->tmp_dir . $prefix . $suffix; if (is_file($file)) unlink($file); } } } ?>