PDA

View Full Version : [tut] - Hướng dẫn cách tạo ảnh random-code antispam



zoejoe
03-05-2008, 00:00
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 :D

Demo : www.zhome.info

Sau đâ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.



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[$random_num];
}

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).


public $width = '';
public $height = '';


Kế tới là


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 :


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[$random_num];
}

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 :


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 ^^)

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 :D. 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.


Demo : www.zhome.info


Nguồn : phpvn.org

[=========> Bổ sung bài viết <=========]

Cheer cho bài viết lúc 00:00 nào :D

[=========> Bổ sung bài viết <=========]

Còn một điều quan trọng nữa là để sử dụng các hàm liên quan đến việc tạo ảnh yêu cầu bạn phải có thư viện GD. Nếu đang sử dụng PHP 5.x thì thương, thư việc GD được mặc định kích hoạt, tuy nhiên, nếu chưa được kích hoạt thì ta làm như sau :

Tại ;extension=php_gd2.dll, ta xóa dấu comment ; phía trước là xong, khởi động lại Apache là có thể sử dụng thư viện được :D

[=========> Bổ sung bài viết <=========]

Trùi, hay thế này mà không ai response cho mình hết. Uổng quá :D

tamphamaz
28-07-2009, 10:59
Mình chưa coi qua, nhưng thanks vì bài viết của bạn nhé! :D

duykhuong-it
28-07-2009, 11:01
"Trùi, hay thế này mà không ai response cho mình hết. Uổng quá "

em đọc thấy câu này lên rp lại cho chị đỡ tiếc mặc dù em không hiểu gì cả :D

trinhdiep
28-07-2009, 15:48
nè dễ èo a. gio nguoi ta thuong chọn các từ có nghĩa hơn là ramdom các kí tự