Trong những năm gần đây, rất nhiều hệ thống các trang web, hệ thống các máy chủ phục vụ thư thường bị các chương trình đăng nhập tự động tấn công. Tác hại của đăng nhập tự động là chúng thường xuyên dò mật khẩu tự động của người dùng dẫn đến nhiều người dùng thực bị mất tài khoản, hơn nữa chúng có thể đăng nhập vào hệ thống và tạo nhiều tài khoản giả làm cho cơ sở dữ liệu của hệ thống đầy lên nhanh chóng, sau đó chúng có thể tự động gửi một lượng lớn thư quảng cáo làm cho hòm thư của người dùng luôn luôn bị đầy.
Giải pháp hiện nay các hệ thống lớn như yahoo, hotmail, gmail thường dùng để ngăn các chương trình đăng nhập tự động là sử dụng ảnh xác nhận mỗi khi đăng ký hoặc đăng nhập vào hệ thống. Việc xây dựng ảnh xác nhận là một vấn đề còn mới và có tính thực tiễn cao nên trong khoá luận này em đã thực hiện việc xây dựng thành phần sinh ảnh xác nhận tự động có khả năng kết nối vào các hệ thống để ngăn chặn đăng nhập tự động.
Nội dung chính của khoá luận này là trình bày cơ sở lý thuyết để giải quyết các vấn đề trên. Nội dung của cơ sở lý thuyết bao gồm sinh ảnh nền, sinh chuỗi ảnh ngẫu nhiên, biến đổi chuỗi ảnh và gây nhiễu chuỗi ảnh. Sau đó tiến hành triển khai thành phần và cuối cùng là thử nghiệm thành phần đã xây dựng trên một hệ thống đơn giản.
57 trang |
Chia sẻ: tuandn | Lượt xem: 1855 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Khóa luận Xây dựng thành phần sinh ảnh chống đăng nhập tự động, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Phần mở đầu
Ngày nay để có một tài khoản thư điện tử, điều đó thật dễ dàng, chúng ta chỉ cần vào một hệ thống nào đó cho phép tạo thư điện tử như yahoo, hotmail, google, vnn và đăng ký một tài khoản. Vậy là chúng ta đã có một tài khoản để có thể gửi thư, chát và sử dụng các tiện ích của thư điện tử. Tuy nhiên đối với hệ thống mailserver, để có thể quản lý tốt hàng triệu tài khoản thực và để tránh cho các chương trình đăng ký, đăng nhập tự động vào hệ thống thực hiện các hành vi phạm pháp của mình thì việc bảo mật cho hệ thống là điều rất quan trọng. Một trong những biện pháp không cho các chương trình đăng ký, đăng nhập tự động có thể đăng ký tài khoản được mà các hệ thống gần đây thường sử dụng là khi muốn đăng ký một tài khoản hay đăng nhập vào hệ thống thì người dùng phải nhập một mã ngẫu nhiên mà hệ thống đưa ra cho người dùng. Nhận thấy đây là một vần đề còn mới và có tính thực tiễn cao nên em đã chọn để làm đề tài trong khoá luận của mình.
Với nội dung như trên, cấu trúc của khoá luận gồm những phần chính sau đây:
Phần mở đầu
Phần này trình bày tại sao chúng tôi chọn đề tài “Xây dựng thành phần sinh ảnh chống đăng nhập tự động” để nghiên cứu trong khoá luận của mình. Cũng trong phần này chúng tôi sẽ giới thiệu nội dung và cấu trúc của khoá luận.
Chương 1: Giới thiệu bài toán và giải pháp
Nội dung của chương này là trình bày về vấn đề đăng nhập tự động và tác hại của nó đối với các hệ thống khi bị đăng nhập tự động. Sau đó chúng tôi đưa ra giải pháp để chống lại sự đăng nhập tự động. Đồng thời chương này cũng giới thiệu một số giải pháp tương tự mà một số hệ thống đã triển khai và những ưu, nhược điểm của các giải pháp đó.
Chương 2: Cơ sở lý thuyết
Chương này sẽ tập trung vào một số thuật toán là cơ sở để giải quyết bài toán đó là các vấn đề sau:
Thuật toán sinh chuỗi ảnh ngẫu nhiên.
Các thuật toán sinh nền.
Các thuật toán biến đổi chuỗi ảnh.
Các thuật toán gây nhiễu bề mặt chuỗi ảnh.
Chương 3: Triển khai thành phần
Chương này trình bày các vấn đề cần thiết trong khi triển khai chương trình như cấu trúc của ảnh, các thủ tục hỗ trợ và cách viết các thủ tục. Đồng thời chương này cũng nêu ra cách tạo ra thành phần phục vụ, sử dụng thành phần phục vụ từ trang web và cách viết các trang tin sử dụng thành phần.
Chương 4: Thử nghiệm
Chương này trình bày các kết quả thử nghiệm và các vấn đề phát sinh trong khi triển khai thành phần.
Phần kết luận
Trong phần này tổng kết lại những kết quả đã đạt được và chưa đạt được. Từ đó nêu lên những hướng nghiên cứu, phát triển tiếp theo.
Các phần phụ lục
Các phần phụ lục sẽ cung cấp thông tin về tài liệu tham khảo, danh mục các thuật toán, các hình.
Chương 1: Giới thiệu bài toán và giải pháp
1.1. Vấn đề đăng nhập tự động
Trước tiên chúng ta cần hiểu thế nào là chương trình đăng ký, đăng nhập tự động? Đó là một chương trình có thể tự động đăng ký tài khoản trên một hệ thống nào đó. Nó cũng có thể tự động điền đầy đủ thông tin về tài khoản như tên tài khoản và mật khẩu để đăng nhập vào hệ thống. Sau đó chúng có thể gửi một khối lượng lớn thư rác cho người dùng thực, tự động gửi thư quảng cáo làm cho hòm thư của người dùng đầy lên nhanh chóng dẫn đến người dùng thực khác muốn gửi thư cho họ đều không được bởi hòm thư đã bị đầy. Các chương trình đăng nhập tự động còn có thể phát tán virus qua các thư rác đó. Ngoài ra chúng còn thực hiện việc đăng ký, đăng nhập hàng nghìn tài khoản liên tục làm cản trở việc đăng ký, đăng nhập của các người dùng thực muốn vào hệ thống, dẫn đến cơ sở dữ liệu của hệ thống cũng bị đầy lên nhanh chóng và còn có thể làm cho hệ thống tạm ngừng hoạt động.
1.2. Tác hại của đăng nhập tự động
Khi các chương trình đăng ký, đăng nhập tự động được phát tán trên Internet, chúng gây ra những tác hại to lớn đối với các hệ thống và đối với cả những người dùng thực
Thứ nhất: Các chương trình tự động có thể dò mật khẩu tự động của người dùng. Chúng vào các trang web và lấy danh sách tên của các người dùng hoặc dò các chuỗi trên mạng có các ký tự @ để sau đó các chương trình này lần lượt dò mật khẩu của người dùng dẫn đến nhiều tài khoản bị chiếm dụng. Để dò mật khẩu, trước tiên chúng dò theo các tên có sẵn trong từ điển, do đó nếu người dùng nào đặt mật khẩu theo các từ có sẵn trong từ điển thì rất dễ bị mất mật khẩu. Ví dụ nếu có người dùng nào đặt mật khẩu kiểu như smooth, holiday thì rất dễ bị phát hiện mật khẩu bởi đó là những từ có sẵn trong từ điển. Ngoài ra nếu mật khẩu nào quá ngắn cũng rất dễ bị dò, ví dụ không nên đặt mật khẩu là “abcd” bởi chúng quá ngắn, hoặc mật khẩu toàn bằng số như 123456 thì các chương trình tự động cũng rất dễ phát hiện được. Vì vậy các hệ thống ngày nay thường khuyến cáo người dùng nên đặt mật khẩu không được quá ngắn, hoặc mật khẩu là các từ có sẵn trong từ điển, hoặc chỉ toàn bằng số hoặc mật khẩu là các thông tin liên quan đến người dùng. Cách tốt nhất để đặt mật khẩu là nên đặt mật khẩu không quá ngắn và cũng không qua dài bởi quá dài thì việc nhập mật khẩu sẽ mất thời gian. Đồng thời mật khẩu phải dễ nhớ đối với người dùng, không được quá khó dẫn đến người dùng dễ bị quên mật khẩu. Mật khẩu phải có cả chữ hoa, chữ thường, và nên có cả số.
Thứ hai: Cùng với việc bùng nổ của công nghệ thông tin thì việc bỏ phiếu bầu cử không còn bị giới hạn bởi kiểu bỏ phiếu truyên thống là cử tri mang phiếu đến các điểm bỏ phiếu để bầu cử. Ngày nay tại rất nhiều nơi đã cho phép thực hiện song song hai hình thức bầu cử đó là có thể bầu cử theo kiểu truyền thống và cử tri còn có thể bầu cử qua mạng Internet. Đối với hình thức bầu cử qua Internet nếu hệ thống không được bảo mật và quản lý tốt, các chương trình đăng nhập tự động gây ra những tác hại to lớn đó là[6][8]:
Ngăn chặn những phiếu bầu gửi đến vote server.
Tự động tạo ra một chương trình để tiếp cận với các phiếu bầu sau đó làm thay đổi nội dung của các lá phiếu đó rồi gửi lại cho các vote server.
Tự động tạo ra các chương trình tự động bỏ phiếu gây nên kết quả sai lệch, không chính xác.
Tự động tạo ra các phiếu bầu giả mạo rồi gửi đến server làm nghẽn các đường truyền gửi đến vote server.
Đăng nhập vào vote server và quản lý server để sau đó thay đổi kết quả cuối cùng của cuộc bầu cử.
Thứ ba: Các chương trình đăng nhập tự động có thể tạo ra nhiều tài khoản ảo rồi gửi đến hệ thống làm cho cơ sở dữ liệu của hệ thống đầy lên nhanh chóng dẫn đến nhiều người dùng thực muốn đăng ký vào hệ thống đều không được. Đồng thời nó sẽ làm giảm hiệu năng hoạt động của hệ thống.
Thứ tư: Các chương trình tự động này tìm danh sách tài khoản của các người dùng rồi gửi một khối lượng lớn thư rác đến các tài khoản đó làm cho hòm thư của họ luôn luôn bị đầy.
Thứ năm: Khi đã đăng nhập được vào hệ thống chúng dễ dàng phát tán virus qua các tài khoản của người dùng.
1.3. Phương pháp giải quyết
1.3.1. Giải pháp
Cơ chế đăng nhập thông thường là người dùng chỉ cần nhập tên tài khoản và mật khẩu là có thể đăng nhập được vào hệ thống.
Hình 1: Minh hoạ cho việc đăng nhập thông thường
Với cơ chế đăng nhập này, như đã phân tích ở trên, các chương trình đăng nhập tự động có thể tự động điền đầy đủ thông tin về tên người dùng và mật khẩu để đăng nhập vào hệ thống.
Vì vậy chúng tôi sử dụng một giải pháp là để đăng ký, đăng nhập được vào hệ thống thì người sử dụng ngoài việc phải nhập tên tài khoản và mật khẩu, họ cần phải nhập đúng mã ảnh xác nhận được sinh ngẫu nhiên mỗi khi người dùng đăng ký hoặc đăng nhập vào hệ thống.
Hình 2: Giải pháp chống đăng nhập tự động
Với giải pháp này, ngoài việc giúp hệ thống ngăn chặn các chương trình đăng nhập tự động, nó còn có khả năng giúp giảm bớt khối lượng công việc cho hệ thống và bảo đảm thực hiện các dịch vụ khác của hệ thống một cách tốt hơn.
1.3.2. Ảnh xác nhận là gì?
Ảnh xác nhận là một bức tranh gồm một chuỗi ngẫu nhiên được sinh trên một ảnh nền, mỗi lần đăng nhập là một chuỗi khác nhau xuất hiện. Đồng thời chuỗi ngẫu nhiên đó được biến đổi như làm xô lệch, làm cong với mục đích các chương trình tự động không thể nhận dạng được chuỗi đó là gì, nhưng người dùng thì vẫn có thể đọc được chuỗi đó
Hình 3: Ví dụ về một ảnh xác nhận
1.3.3. Hoạt động của ảnh xác nhận
Theo[11], mỗi khi người dùng vào trang đăng ký hoặc trang đăng nhập, các trang này sẽ gửi thông báo đến hệ thống. Hệ thống sau đó tự động sinh ra một chuỗi ảnh ngẫu nhiên. Chuỗi này được biến đổi làm cho chương trình nhận dạng không thể nhận được tuy nhiên người dùng thực vẫn có thể đọc được. Đồng thời một sự kiện tại ô xác nhận ảnh được kích hoạt để kiểm tra các ký tự được nhập vào. Nếu chuỗi được nhập vào trùng với chuỗi ảnh ngẫu nhiên, khi đó hệ thống xác minh được rằng đang đăng nhập vào hệ thống là người dùng thực và sẽ cho đăng nhập. Ngược lại, nếu nhập sai người dùng sẽ không thể đăng nhập và một ảnh mới sẽ lại được sinh ra
1.3.4. Tại sao không sử dụng các ảnh lưu trữ trong cơ sở dữ liệu?
Với những ảnh có sẵn trong cơ sở dữ liệu thì qua một số lần, chương trình đăng nhập tự động sẽ dễ dàng phát hiện được quy luật xuất hiện của các ảnh. Từ đó nó dễ dàng xác định được dòng chữ xuất hiện trên các bức tranh và nó sẽ nhập được dòng chữ vào ô “Chữ xác nhận” mỗi khi bức tranh xuất hiện. Khi đó các chương trình tự động hoàn toàn có thể vẫn có thể đăng nhập vào hệ thống.
Khi chúng ta sinh chuỗi ảnh ngẫu nhiên, các chương trình tự động cũng có thể lưu trữ được các chuỗi ảnh mới sinh, tuy nhiên mỗi lần đăng nhập thì có một ảnh mới được sinh ra, chương trình tự động lại phải lưu trữ một ảnh. Như thế chương trình tự động sẽ không thể lưu được hết bởi khả năng lưu trữ của nó cũng chỉ có một giới hạn nhất định . Điều đó tránh được việc tấn công bảo tồn.
1.4. Giải pháp sinh ảnh tự động đã có người thực hiện chưa? Thực hiện như thế nào và có thể sử dụng lại được không?
1.4.1. Giải pháp đã có của yahoo, hotmail, gmail
Việc sử dụng thành phần sinh ảnh tự động để chống đăng nhập đã có một số hệ thống thực hiện mà điển hình là yahoo, google, hotmail tuy nhiên chúng là các chương trình gắn liền với các hệ thống đó. Do đó các hệ thông khác muốn sử dụng lại đều không được.
Yahoo đã triển khai giải pháp sinh ảnh tự động từ rất sớm, họ đã ứng dụng việc này vào hai nơi đó là
Thứ nhất: Khi đăng ký một tài khoản email, người dùng sau khi đăng ký tên tài khoản, mật khẩu và một số thông tin cần thiết khác, họ cần phải nhập mã xác nhận đăng ký được sinh ngẫu nhiên trước khi hoàn thành việc đăng ký.
Mã xác nhận mà người dùng cần nhập
Hình 4: Ảnh xác nhận được Yahoo sử dụng khi người dùng đăng ký tài khoản mới
Thứ hai: Để vào hòm thư yahoo của mình, người dùng cần phải nhập tên tài khoản, mật khẩu. Nếu người dùng nhập tài khoản và mật khẩu không đúng khoảng 8 lần, hệ thống tự động sinh ra chuỗi ngẫu nhiên yêu cầu người dùng phải nhập chuỗi đó vào ô xác nhận ảnh.
Giao diên đăng nhập vào hòm thư mà
yahoo áp dụng thành phần sinh ảnh tự động
Hình 5: Ảnh xác nhận được Yahoo sử dụng mà người dùng vào hòm thư
Chúng ta thấy rằng ảnh xác nhận được yahoo xây dựng dựa trên một nền đen hoặc trắng, chuỗi ngẫu nhiên thì được làm cong theo các kiểu khác nhau. Đồng thời các chuỗi ngẫu nhiên này đã được gây nhiễu để các chương trình nhận dạng dù rất nhạy cũng không thể nhận dạng đúng được chuỗi ký tự, tuy nhiên người dùng vẫn hoàn toàn xác định chính xác chuỗi ký tự đã được sinh ra. Ví dụ trong hình 5, ký tự tại vị trí thứ 2 là chữ “d”, nhưng do việc gây nhiễu đã làm cho chữ “d” đó vừa có nét giống chữ “d” lại vừa có nét giống chữ “q”. Tại vị trí thứ 5, đó là chữ “p” và cũng do gây nhiễu nó trở nên vừa giống chữ “p” vừa giống chữ “d” đối với các hệ nhận dạng. Khi đó hệ nhận dạng sẽ không xác định được đó là chữ gì.
Giống như yahoo, gmail và hotmail cũng đã triển khai việc sử dụng thành phần sinh ảnh tự động để chống đăng nhập tự động và họ cũng áp dụng khi người dùng muốn vào hòm thư của mình.
Giao diện đăng nhập vào hòm thư áp dụng thành phần sinh ảnh của hotmail và gmail
Hình 6: Giải pháp của hotmail và gmail
Trong ảnh xác nhận của hotmail thì chuỗi ảnh đã được làm biến dạng và gây nhiễu bằng các đường thẳng và đường cong. Đồng thời hotmail đã cải tiến việc nhận dạng ảnh đối với những người dùng bằng việc đối với ảnh xác nhận người dùng không nhận dạng được thì họ có thể nghe hệ thống đọc các ký tự vừa sinh để điền vào ô xác nhận. Đối với gmail, ảnh xác nhận mà họ xây dựng mới chỉ dừng lại ở việc chuỗi ký tự ngẫu nhiên sinh ra đã được biến dạng, còn việc gây nhiễu thì chưa được thực hiện.
1.4.2. Giải pháp có mã nguồn mở
Ngoài yahoo, hotmail, gmail thực hiện giải pháp sinh ảnh tự động để chống đăng nhập tự động, hiện nay cũng có một số chương trình xây dựng thành phần sinh ảnh tự động để chống đăng ký tự động. Họ triển khai giải pháp này bằng mã nguồn viết bằng PHP[21]. Có thể tóm tắt giải pháp của họ như sau:
Trước tiên [21] sinh một chuỗi ngẫu nhiên gồm 6 ký tự. Các ký tự được sinh ra là các chữ hoa trong bảng chữ cái alphabe và các chữ số từ 0 đến 9.
Giải thuật sinh chuỗi ngẫu nhiên mà [21] viết như sau:
function gen_random_string($length = 5, $str = ' ')
{
for($i =1; $i<=length; $i++)
{
$ord = rand(48, 90);
if((($ord>=48) && ($ord=65) && ($ord<=90)))
{
$str.=chr($ord);
}
else $str.=gen_random_string(1);
}
return $str;
}
Cùng với việc sinh chuỗi ngẫu nhiên, họ sinh nền ngẫu nhiên dựa trên các hàm có sẵn của PHP, có thể tóm tắt sơ qua giải thuật đó như sau:
function Gen_rand_img()
{ Định nghĩa font của file
Định nghĩa một số màu ngẫu nhiên
{ Xác định màu nền ngẫu nhiên
//$bg_colors = array(BACKGROUND COLORS);
Xác định màu của font
//$font_colors = array(FONT COLORS);
}
Định nghĩa chiều dài, chiều rộng của ảnh
Xác định kích cỡ chữ, khoảng cách giữa các chữ
Độ dài chuỗi
Gọi hàm sinh chuỗi ngẫu nhiên
Thực hiện việc lấy chuỗi ngẫu nhiên
Tạo ảnh băng việc sử dụng thư viện của PHP
Xác định nền và màu của chữ
Ghi chuỗi vào ảnh
}
Kết quả của chương trình đó như sau:
Hình 7: Minh hoạ giải pháp được viết bằng PHP
Nhận xét: Mỗi lần chạy chương trình đều sinh ra được một nền với màu khác nhau và các chuỗi cũng được sinh ngẫu nhiên. Tuy nhiên đối với những ảnh ngẫu nhiên này, các chương trình nhận dạng chuyên nghiệp hoàn toàn có thể nhận dạng ra các ký tự đó bởi các ký tự trong những chuỗi đó không được làm biến dạng. Đồng thời những nền được sinh ra rất đơn giản, dễ dàng bị tách cạnh và các ảnh sinh ra lại không được gây nhiễu. Do đó nếu hệ thống nào sử dụng chương trình này để sinh mã xác nhận thì khả năng bị đăng nhập tự động là vẫn có thể.
Mặt khác do sự sắp xếp của các ký tự gần như trên hai dòng, nên có thể hiểu chuỗi gồm “FUD4N1” cũng có thể hiểu là “FDN” ở dòng trên và “U41” ở dòng dưới. Do đó người dùng sẽ không biết nhập thế nào.
Chương 2: Cơ sở lý thuyết
Quá trình xây dựng thành phần sinh ảnh tự động là sự kết hợp của nhiều thuật toán. Đó là quá trình sinh chuỗi ngẫu nhiên, biến chuỗi ngẫu nhiên thành ảnh, sinh nền, ghép chuỗi ảnh vào nền, thực hiện biến đổi chuỗi ảnh theo các hình khác nhau, sử dụng các kỹ thuật để gây nhiều bề mặt ảnh.
2.1. Thuật toán sinh chuỗi ngẫu nhiên
Mô tả thuật toán
Đầu vào: Rỗng
Đầu ra: Chuỗi gồm từ 6 đến 12 ký tự ngẫu nhiên
Các bước thực hiện:
Bước1: Khởi tạo một từ điển gồm các chữ cái trong bảng mã alphabel và các chữ số từ 0 đến 9
Bước 2: Xác định ngẫu nhiên số các ký tự sẽ được sinh ra
Bước 3: Để sinh từng ký tự, lấy ngẫu nhiên môt ký tự trong từ điển.
Bước 4: Lặp lại việc lấy ngẫu nhiên đó đến khi nào sinh đủ số ký tự thì dừng lại
Thuật toán có thể được viết bằng ngôn ngữ C như sau
void GenRanString(char *){
dict[] ="abcdefghijklmnopqrstuvxywz0123456789";
ndict = sizeof(dict)/sizeof(*dict);
n = 6 +rand()%9;
for(i=6; i<n; i++) s[i] = dict[rand()%ndict];
s[i] = 0;
}
2.1.1. Tại sao lại sinh chuỗi gồm từ 6 đến 12 ký tự?
Chúng tôi sinh ra chuỗi ngẫu nhiên gồm từ 6 đến 12 kỹ tự bởi nếu ít hơn 6 kỹ tự thì chương trình dò tìm tự động dễ dàng phát hiện được tổ hợp bộ ký tự sinh ra, còn nếu nhiều hơn 12 ký tự thì người dùng phải nhập nhiều ký tự làm tốn thời gian của người dùng. Vì vậy chúng tôi nghĩ rằng bộ chuỗi ngẫu nhiêu gồm từ 6 đến 12 ký tự là phù hợp, các chương trình dò tự động cũng rất khó dò được bộ ký tự đó và người dùng cũng không tốn thời gian cho việc nhập số ký tự đó.
2.1.2. Kỹ thuật biến đổi chuỗi thành ảnh
Trong kỹ thuật biến đổi này chúng tôi sử dụng một bộ nhớ thiết bị ngữ cảnh - Memory Device Context(DC) để triển khai.
Device Context là một cấu trúc chứa thông tin về thiết bị. Sử dụng DC để lưu trữ, khôi phục và thay đổi thuộc tính của đối tượng đồ hoạ
Thuật toán
Đầu vào: Một chuỗi ngẫu nhiên
Đầu ra: Một ảnh chứa chuỗi ngẫu nhiên trên
void TextToImage( image, string)
{
HDC dc = CreateDC("DISPLAY", NULL, NULL, NULL);
HDC memdc = CreateCompatibleDC(dc);
HBITMAP bmp = CreateCompatibleBitmap(dc, GetDeviceCaps(dc, HORZRES), GetDeviceCaps(dc, VERTRES));
SelectObject(memdc, bmp);
SetFontForText(memdc, fontname, fontsize);
SetTextColor(memdc, RGB(0,0,0));
GetTextExtentPoint(memdc, str, strlen(str), &sz);
TextOut(memdc, 0, 0, str, strlen(str));
for(i=0; iheight; i++)
for(k=0; kwidth; k++)
{
img->a[i][k] = GetPixel(memdc, k, i);
}
}
Trong đó:
HDC: Con trỏ tới thiết bị ngữ cảnh
Hàm CreateDC("DISPLAY", NULL, NULL, NULL) tạo một thiết bị ngữ cảnh
Hàm CreateCompatibleDC(dc) tạo một bộ nhớ thiết bị ngữ cảnh tương thích với thiết bị theo danh nghĩa
CreateCompatibleBitmap(dc,GetDeviceCaps(dc,HORZRES), GetDeviceCaps(dc, VERTRES))
tạo một ảnh bitmap tương ứng với chiều rộng và chiều cao của thiết bị ngữ cảnh
Hàm GetDeviceCaps(dc, HORZRES) trả về thông tin chiều ngang của thiết bị ngữ cảnh
Hàm GetDeviceCaps(dc, VERTRES) trả về thông tin chiều cao của thiết bị ngữ cảnh
Hàm SelectObject(memdc, bmp) chọn một ảnh bitmap đưa vào bộ nhớ thiết bị ngữ cảnh, ảnh mới sẽ thay thế ảnh cũ
Hàm SetFontForText(memdc, fontname, fontsize) xác định kiểu chữ và kích cỡ cho chuỗi ảnh
Hàm SetTextColor(memdc, RGB(0,0,0)) xác định màu của chuỗi ảnh
Hàm GetTextExtentPoint(memdc, str, strlen(str), &sz) trả về chiều dài chuỗi ký tự
Hàm TextOut(memdc, 0, 0, str, strlen(str)) ghi chuỗi ký tự ra bộ nhớ thiết bị ngữ cảnh
GetPixel(memdc, k, i): trả về mầu của điểm ảnh (i, k) cho bộ nhớ thiết bị ngữ cảnh
sz: kích cỡ của chuỗi ngẫu nhiên
2.2. Các thuật toán sinh ảnh nền
2.2.1. Tại sao phải sinh ảnh nền?
Với những ảnh đơn giản, chương trình nhận dạng dễ dàng thực hiện việc tách cạnh, tìm biên, tách chuỗi ảnh ra khỏi nền để sau đó có thể thực hiện việc dò chuỗi ảnh ngẫu nhiên được sinh ra. Vì vậy để làm cho các thuật toán tách cạnh, tìm biên không hiệu quả chúng tôi sẽ cho sinh ra những nền có cấu trúc phức tạp hơn.
2.2.2. Sinh ảnh nền dạng dải màu (ribbon)
Các dải màu được tạo ra rất đơn giản bằng cách sử dụng hàm tuyến tính hai biến. Phương pháp sinh là duyệt tất cả các điểm. Với mỗi điểm ta thay giá trị màu bằng giá trị của hàm số. Hàm số để sinh dải màu như sau:
f(x, y) = 255 – a*x – b*y
Trong chương trình, chúng tôi sử dụng ảnh 256 màu do đó phương trình chỉ cần cho hệ số 255. Trong trường hợp tổng quát, chúng ta có thể sử dụng phương trình đường thẳng:
f(x, y) = a*x + b*y + c
Có thể viết đơn giản thuật toán sinh dưới ngôn ngữ tựa lập trình như sau
void GenRibbon(left, right, top, bottom)
{ for(x=left; x<right; x++)
for(y=top; y<bottom; y++){
t = 255 – 8x – 6y;
SetPixel(x, y, RGB(t+rand()%128, t+rand()%128, t));
}
}
Kết quả sau khi áp dụng thuật toán:
Hình 8: Ảnh nền dạng dải màu
2.2.3. Sinh ảnh nền dạng vải sợi(Fabric)
Miếng vải thường được trang trí với mẫu khác nhau. Các mẫu này được tạo ra bằng cách lặp lại một mẫu nguyên tố nào đó. Chúng tôi không dùng phương pháp này mà sử dụng hàm sin và cos vì bản thân hai hàm này tuần hoàn dẫn đến việc các mẫu tự động lặp lại. Công thức để sinh nền vải sợi như sau:
Có thể viết đơn giản thuật toán sinh dưới ngôn ngữ tựa lập trình như sau:
void GenFabric(left, right, top, bottom)
{
for(x=left; x<=right; x++)
for(y= top;y<=bottom; y++){
pixel=
SetPixel(x, y, RGB(pixel, pixel, pixel));
}
}
Kết quả sau khi áp dụng thuật toán
Hình 9: Ảnh nền
Các file đính kèm theo tài liệu này:
- Khoaluan.doc
- Bia_Loicamon_Tomtat.doc