Thứ Năm, 9 tháng 4, 2009

Tạo hiệu ứng chuyển màu trong VB6

Không gian RGB:

Không gian RGB dùng 3 màu cơ bản đỏ (Red), xanh lá cây (Green), xanh dương (Blue) để tạo nên các màu khác. Trong không gian này, màu sắc được tạo ra bằng cách tổng hợp ba màu trên, trong đó, mỗi thành phần màu mang một giá trị, giá trị này cho biết cường độ thành phần màu đó tham gia vào màu tổng hợp. Miền giá trị của mỗi màu cơ bản là từ 0 đến 255. Như vậy, trong không gian RGB, ta có thể tạo ra 2563 màu (hơn 16 triệu màu).

Không gian RGB được minh họa bằng hệ trục tọa độ 3 chiều với các trục là R, G, B.

gradient1 by minah2710.

Nguyên tắc tạo hiệu ứng chuyển màu:

Giả sử bạn muốn tạo hiệu ứng chuyển màu từ màu C1 (R1, G1, B1) sang màu C2 (R2, G2, B2). Trong hệ tọa độ màu, bạn nối hai điểm màu này sẽ được một đoạn thẳng (chính là tập hợp các điểm màu). Trải đều các điểm màu này lên một chiều dài là bạn đã tạo ra hiệu ứng chuyển màu từ màu C1 (R1, G1, B1) sang màu C2 (R2, G2, B2) trên chiều dài đó. Mỗi điểm màu cấu tạo bởi 3 thành phần R, G, B nên chia đều các điểm màu cũng chính là chia đều từng thành phần R, G, B.

Cách thực hiện như thế nào? Ta chia chiều dài cần tô màu thành n khoảng, mỗi khoảng được tô bởi một màu. Khoảng thứ nhất được tô bằng màu C1 (R1, G1, B1), khoảng thứ n được tô bằng màu C2 (R2, G2, B2). Thành phần R thay đổi từ R1 đến R2 sẽ phải chia đều cho n khoảng, do vậy hai khoảng kế nhau có thành phần R chênh lệch nhau (R2-R1)/n. Tương tự, thành phần G và B ở hai khoảng kế nhau sẽ chênh lệch nhau (G2-G1)/n và (B2-B1)/n.

gradient2 by minah2710.

Lần lượt tô từng khoảng với màu sắc thay đổi theo nguyên tắc trên sẽ tạo ra hiệu ứng chuyển màu trên chiều dài cần tô màu.

Hiệu ứng chuyển màu trên Form:

Ta sẽ viết chương trình tô chuyển màu Form theo chiều ngang từ màu (R1,G1,B1) sang màu (R2,G2,B2).

gradient3 by minah2710.

Bạn tạo một Project mới thuộc loại Standard EXE. Các thuộc tính của Form1:

(Name)

Form1

AutoRedraw

True

DrawWidth

1

ScaleMode

3 - Pixel

Ta cho một khoảng ở đây là đoạn thẳng độ lớn 1 pixel, do vậy số khoảng cũng là chiều dài của Form. Để tô màu cho một khoảng, ta dùng phương thức Line của Form (vẽ đường thằng).

Phần mã chương trình:

Option Explicit

Private Sub Gradient(R1 As Integer, G1 As Integer, B1 As Integer, R2 As Integer, G2 As Integer, B2 As Integer)

Dim R As Integer

Dim G As Integer

Dim B As Integer

Dim dR As Single

Dim dG As Single

Dim dB As Single

Dim i As Integer

dR = (R2 - R1) / Form1.ScaleWidth

dG = (G2 - G1) / Form1.ScaleWidth

dB = (B2 - B1) / Form1.ScaleWidth

For i = 0 To Form1.ScaleWidth

R = R1 + dR * i

G = G1 + dG * i

B = B1 + dB * i

Form1.Line (i, 0)-(i, Form1.ScaleHeight), RGB(R, G, B)

Next i

End Sub

Private Sub Form_Load()

Gradient 255, 0, 0, 0, 0, 0

End Sub

Bạn có thể áp dụng tương tự để tô chuyển màu một PictureBox, hoặc tô chuyển màu theo chiều dọc.

Viết chữ chuyển màu:

Chương trình sẽ viết ra trên Form dòng chữ chuyển từ màu (R1, G1, B1) sang màu (R2, G2, B2) (bạn có thể áp dụng tương tự để viết chữ chuyển màu trên một PicturexBox).

gradient4 by minah2710.

Ta cho một khoảng là từng ký tự của dòng chữ, do vậy số khoảng cũng là số ký tự của dòng chữ. Từng khoảng (từng ký tự) sẽ được viết với các màu khác nhau.

Bạn tạo một Project mới thuộc loại Standard EXE. Thuộc tính AutoRedraw của Form1 là True.

Phần mã chương trình:

Option Explicit

Private Sub ShadeText(x As Integer, y As Integer, R1 As Integer, G1 As Integer, B1 As Integer, R2 As Integer, G2 As Integer, B2 As Integer, s As String)

Dim R As Integer

Dim G As Integer

Dim B As Integer

Dim dR As Single

Dim dG As Single

Dim dB As Single

Dim i As Integer

dR = (R2 - R1) / Len(s)

dG = (G2 - G1) / Len(s)

dB = (B2 - B1) / Len(s)

Form1.CurrentX = x

Form1.CurrentY = y

For i = 1 To Len(s)

R = R1 + dR * i

G = G1 + dG * i

B = B1 + dB * i

Form1.ForeColor = RGB(R, G, B)

Form1.Print Mid$(s, i, 1);

Next i

End Sub

Private Sub Form_Load()

ShadeText 120, 180, 255, 0, 0, 0, 0, 255, "This text fades from red to blue."

End Sub

Kết quả rất ấn tượng, nhưng cách làm lại rất đơn giản! Chúc bạn thành công!

Ngô Bảo Khoa

Thế giới @ 83

Không có nhận xét nào:

Đăng nhận xét