Hi all, mới đọc được cái này, đang rảnh nên cũng chia sẽ cho bà con xài chơi
Demo :
www.zhome.infoSau đây tui sẽ hướng dẫn mọi người cách tạo ra 1 hình ảnh random code dùng để anti-spam, nhưng hiện giờ thì hình như nó không còn tác dụng nhiều cho lắm (chỉ để học hỏi thôi!)
Ta tạo 1 file tên gì cũng được, chứa class tạo ảnh cần thiết. Class này createPicture.
PHP Code:
class createPicture
{
/*
* object properties
*/
public $width = '';
public $height = '';
// available charactor will be splitted
public $available =
'0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z';
private $available_array = array();
public $string_random = '';
// generate random code ^^
private function generateCode($length)
{
// make random string
try {
$this->string_random = '';
for ($i = 1; $i < $length; $i++)
{
$random_num = mt_rand(0, count($this->available_array) - 1);
$this->string_random .= $this->available_array***91;$random_num***93;;
}
return true;
} catch(exception $e) { return $e; }
}
function createPicture($length_char = 7, $width = 100, $height = 30, $available = '')
{
try {
if($available != '') {
$this->available = $available;
}
// length char must be under 10
if($length_char > 10) { return false; }
$this->available_array = split('-', $this->available);
$this->height = $height;
$this->width = $width;
// make random string
$this->generateCode($length_char);
// now create image contents charactors on it ^^
$image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream');
$background_color = imagecolorallocate($image, 96, 195, 255);
$text_color = imagecolorallocate($image, 255, 255, 255);
$noise_color = imagecolorallocate($image, 100, 120, 180);
// tao cac diem cham ngau nhien cho anh
for( $i=0; $i<($width*$height)/3; $i++ ) {
imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
}
// tao cac duong ke ngau nhien cho hinh anh
for( $i=0; $i<($width*$height)/150; $i++ ) {
imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
}
/* create textbox and add text */
imagestring($image, 100, 5, 5, $this->string_random, $text_color);
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
return true;
} catch(exception $e) { return $e; }
}
}
Ta sẽ đi sâu vào chi tiết class trên. Đầu tiên là 2 thuộc tính rộng và ngang (chưa set value).
PHP Code:
public $width = '';
public $height = '';
Kế tới là
PHP Code:
public $available =
'0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z';
private $available_array = array();
public $string_random = '';
Với
- $available là các kí tự sẽ dùng để tạo chuỗi random.
- $available_array là mảng sẽ chứa các kí tự của $available sau khi bị cắt ra.
- $string_random chính là kết quả sau khi generate code.
Tiếp đó là phương thức :
PHP Code:
private function generateCode($length)
{
// make random string
try {
$this->string_random = '';
for ($i = 1; $i < $length; $i++)
{
$random_num = mt_rand(0, count($this->available_array) - 1);
$this->string_random .= $this->available_array***91;$random_num***93;;
}
return true;
} catch(exception $e) { return $e; }
}
Phương thức này chủ yếu là nhằm tạo ra chuỗi $string_random bằng cách lấy ngẫu nhiên các kí tự trong mảng $available_array rồi kết hợp lại.
Tiếp tới mới là phương thức quan trọng của chúng ta :
PHP Code:
function createPicture($length_char = 7, $width = 100, $height = 30, $available = '')
Tham số dành cho phương thức này gồm độ dài chuỗi (ý là bao nhiêu kí tự í), độ rộng, cao của hình.
Sau một số bước ngoằn nghoèo tiếp theo, ta generateCode ra chuỗi ngẫu nhiên.
Tiếp tới là $image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream');
$background_color = imagecolorallocate($image, 96, 195, 255);
$text_color = imagecolorallocate($image, 255, 255, 255);
$noise_color = imagecolorallocate($image, 100, 120, 180);
- $image = @imagecreate($width, $height) chính là việc tạo ra 1 hình ảnh trống và assign nó vào biến image.
- Tiếp đó ta set các thông số về màu sắc và độ nhiễu của ảnh bằng cách
$background_color = imagecolorallocate($image, 96, 195, 255);
$text_color = imagecolorallocate($image, 255, 255, 255);
$noise_color = imagecolorallocate($image, 100, 120, 180); (ai có kiến thức về màu sắc thì tự thay thế, còn tui thì vô PTS để lấy mã màu).
Tiếp theo ta tạo các chấm và đường kẻ ngẫu nhiên cho hình (ai thích làm sao thì làm, không bắt buộc ^^)
Hướng dẫn cách tạo ảnh random-code antispam
Bây giờ ta chèn text vào hình : imagestring($image, 100, 5, 5, $this->string_random, $text_color);
100 là int font (đô lớn), tui set cho nó maximum luôn, nhưng thực tế thì max của nó chỉ cỡ 6~7 thôi, để lố thì nó cũng chẳng bự hơn . Tiếp đến là vị trí của chữ trong hình (tọa độ x, y). Cuối cùng là chèn chữ và đưa màu chữ vào. Ta đặt header là Content-Type: image/jpeg để trình duyệt hểu nó và xử lí như 1 hình ảnh jpeg bình thường. Tiếp tới ta đưa ra hình ảnh và xóa bộ nhớ chứa ảnh (để giảm tải server í mà) : imagejpeg($image);
imagedestroy($image);
Xong xui hết, ta khởi tạo đối tượng, đưa tham số vào đó :
$create_random_code = new createPicture(7, 68, 25);
$_SERVER['antispam_code'] = $create_random_code->string_random;
Phia cuối ta set session cho nó để có gì còn KT. (nhớ trên đầu trang thêm vào session_start(); để khởi tạo session.