Màu sắc trong VB6
A- Căn bản màu trong VB6Vb6 quy định màu sắc dựa trên 3 màu đơn sắc chính: Đỏ (Red), Lục (Green) và Lam (hay xanh đậm Blue)
Mỗi màu sắc được biểu thị bằng một số Long từ 0 đến 16777215 dựa trên hàm RGB([0-255], [0-255], [0-255]);
nghĩa là với hệ RGB ta có 16777216 màu tổng hợp.
(= 255*256*256 + 255*256 + 255)
Các số Long về màu sắc (nhắc lại số Long đến 2147483647 nhưng màu chỉ đến 16777215) có thể được viết dưới 2 dạng:
dạng hệ đếm 10 hay dạng hệ đếm 16. ví dụ:
Màu đen: Dec = 0; Hex = &H0 hay &H000000
Màu trắng: Dec = 16777215; Hex = &HFFFFFF
Trên số Hex có 6 chữ số (nếu không đủ, cứ thêm số 0 ở đằng trước)
2 số sau biểu thị màu đỏ
2 số giữa biểu thị màu lục
2 số đầu biểu thị màu lam
Mở một Project với Form1 mặc định, màu mặc định của Form1 là &H8000000F (Button Face colour), đó là màu mang số Dec là 13160917 hay Hex là C8D1D5 mà yếu tố Red là D5 hay 213; yếu tố Green là D1 hay 209 và yếu tố Blue là C8 hay 200.
Nhận xét: Số &H8000000F chuyển qua Dec là 2147483663, lớn hơn cả số Long. Đây là nhóm số đặc biệt mà VB6 quy định là màu (System Color).
Chi tiết, bạn taykhongbatgiac đã cung cấp như sau:
"&H80000000": R = 213: G = 209: B = 200: 'Scroll Bars colour
"&H80000001": R = 63: G = 109: B = 167: 'Desktop colour
"&H80000002": R = 0: G = 0: B = 107: 'Active Title Bar colour
"&H80000003": R = 128: G = 128: B = 128: 'Inactive Title Bar colour
"&H80000004": R = 213: G = 209: B = 200: 'Menu Bar colour
"&H80000005": R = 255: G = 255: B = 255: 'Window Background colour
"&H80000006": R = 0: G = 0: B = 0: 'Window Frame colour'
"&H80000007": R = 0: G = 0: B = 0: 'Menu Text colour
"&H80000008": R = 0: G = 0: B = 0: 'Window Text colour
"&H80000009": R = 255: G = 255: B = 255: 'Active Title Bar Text colour
"&H8000000A": R = 213: G = 209: B = 200: 'Active Border colour
"&H8000000B": R = 213: G = 209: B = 200: 'Inactive Border colour
"&H8000000C": R = 128: G = 128: B = 128: 'Application Workspace colour
"&H8000000D": R = 0: G = 0: B = 107: 'Highlight colour
"&H8000000E": R = 255: G = 255: B = 255: 'Highlight Text colour
"&H8000000F": R = 213: G = 209: B = 200: 'Button Face colour
"&H80000010": R = 128: G = 128: B = 128: 'Button Shadow colour
"&H80000011": R = 128: G = 128: B = 128: 'Disabled Text colour
"&H80000012": R = 0: G = 0: B = 0: 'Button Text colour
"&H80000013": R = 213: G = 209: B = 200: 'Inactive Toolbar Text colour
"&H80000014": R = 255: G = 255: B = 255: 'Button Highlight colour
"&H80000015": R = 213: G = 209: B = 200: 'Button Dark Shadow colour
"&H80000016": R = 213: G = 209: B = 200: 'Button Light Shadow colour
"&H80000017": R = 0: G = 0: B = 0: 'Tooltip Text colour
"&H80000018": R = 255: G = 255: B = 225: 'Tooltip colour
Ngoài ra, trong thư viện VBRUN, với Enum ColorConstants, ta có các hằng sau:
Const vbBlack = 0
Const vbBlue = 16711680 (&HFF0000)
Const vbCyan = 16776960 (&HFFFF00)
Const vbGreen = 65280 (&HFF00)
Const vbMagenta = 16711935 (&HFF00FF)
Const vbRed = 255 (&HFF)
Const vbWhite = 16777215 (&HFFFFFF)
Const vbYellow = 65535 (&HFFFF)
B- Cách đổi trị số Long ra các yếu tố RGB và ngược lại1- Phân tích số Long ra RGB: có rất nhiều cách
* Đổi số Long qua dạng Hex, 2 số sau là R, 2 số giữa là G và 2 số đầu là B. Nếu số Hex không đủ 6 chữ số, ta cứ thêm số 0 ở đầu cho đủ
1. Private Function TachMau(Mau As Long) As String
2. dim red as long, green as long, blue as long
3. red = Mau And &HFF
4. green = (Mau And &HFF00&) \ &H100&
5. blue = (Mau And &HFF0000) \ &H10000
6. TachMau = "R: " & CStr(red) & " G: " & CStr(green) & " B: " & CStr(blue)
7. End Function
*
1. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
2. Private Function TáchMau(Mau As Long) As String
3. Dim m(2) As Byte
4. CopyMemory m(0), Mau, 3
5. TáchMau = "R: " & m(0) & " G: " & m(1) & " B: " & m(2)
6. End Function
2- Từ các trị R, G và B. Chuyển thành số Long:
Ví dụ đã dùng: "&H8000000F": R = 213: G = 209: B = 200: 'Button Face colour
Ta dùng code sau:
MsgBox RGB(213, 209, 200)
C- Các cách trộn màu sắcNhấn mạnh rằng, dù cách trộn gì thì code VB6 cũng dựa trên hàm RGB
1- Trộn màu nguồn sáng (hay dùng)
Hay gọi là trộn màu cọng
* Trong không gian đen thui (không có ánh sáng) ta rọi tới nền trắng tia đỏ 255 và tia lục 255, kết quả ta có màu vàng (FFFF).
* Nếu ta rọi tia đỏ 170 và một tia đỏ 50, ta cũng chỉ thu được màu đỏ 170. Hoàn toàn tia đỏ không đậm hơn, nghĩa là ta không thể có màu đỏ 220.
Cho đến nay (nhờ Google) tôi chưa được đọc một code VB6 nào về pha màu tốt
Các phép toán AND, OR, XOR NOT lại càng không thể dùng được! Đây là các phép toán trên hệ nhị phân, không thể ứng dụng trong việc trộn màu.
Tôi ví dụ,
Rọi tia đỏ 224 và tia đỏ 225. Nếu dùng phép OR ta thu được kết quả 225
Rọi tia đỏ 224 và tia đỏ 223. Nếu dùng phép OR ta thu được kết quả 255
Bạn có quyền viết code theo ý riêng, miễn sao tuân thủ các điều kiện sau:
* red 255 + green 255 = yellow = 65535 (&HFFFF)
* red 255 + blue 255 = Magenta = 16711935 (&HFF00FF)
* green255 + blue 255 = Cyan = 16776960 (&HFFFF00)
* red 255 + green 255 + blue 255 = White = 16777215 (&HFFFFFF)
* red a + red b = red a nếu a>b
Để trộn 2 màu bất kỳ, trước tiên ta tách mỗi màu thành các yếu tố cơ bản R1, G1 và B1; R2, G2 và B2
sau đó phối hợp các yếu tố cùng nhóm (R1 và R2), (G1 và G2), (B1 và B2)
Việc phối hợp yếu tố cùng nhóm, tôi dùng code như sau:
1. If R1 > R2 then R = R1 Else R = R2
2. KetQua = RGB(R, G, B)
2- Trộn màu chất liệu (sơn, mực...)
Hay gọi là trộn màu trừ
Với lọ sơn màu đỏ và lọ sơn màu lục, khi trộn, ta hy vọng thu màu vàng như mục C-1.
Kết quả lại là màu đen!
Các điều kiện cần tuân thủ khi viết code trộn màu chất liệu
* Cyan (FFFF00) + Magenta (FF00FF) = Blue (FF0000)
* Cyan (FFFF00) + Yellow (FFFF) = Green (FF00)
* Magenta (FF00FF) + Yellow (FFFF) = Red (FF)
* Cyan + Magenta + Yellow = Black (0)
Tôi viết code trộn màu chất liệu như sau:
KetQua = RGB(Abs(R - 255), Abs(G - 255), Abs(B - 255))
D- Mã nguồn và Project đính kèm:Ghi chú: Code tôi viết bạn có quyền không đồng ý và chỉnh sửa lại tùy thích
1. Private Sub Command1_Click()
2. If Command1.Caption = "+" Then
3. Command1.Caption = "-"
4. Me.Caption = "Trôn màu -> Châ't liêu: Nê`n Tra'ng"
5. Else
6. Command1.Caption = "+"
7. Me.Caption = "Trôn màu -> Nguô`n sáng: Nê`n Ðen"
8. End If
9. Màu
10. End Sub
11.
12. Private Sub Form_Load()
13. ' Code: truongphu 2009
14. Màu
15. End Sub
16. Private Sub Màu()
17. Label1.Caption = HScroll1.Value
18. Label2.Caption = HScroll2.Value
19. Label3.Caption = HScroll3.Value
20. Label5.Caption = HScroll4.Value
21. Label6.Caption = HScroll5.Value
22. Label7.Caption = HScroll6.Value
23.
24. If Command1.Caption = "+" Then '''''''''''''''''''''''''''''' Cong Màu
25. Label1.BackColor = vbRed
26. Label5.BackColor = vbRed
27. Label2.BackColor = vbGreen
28. Label6.BackColor = vbGreen
29. Label3.BackColor = vbBlue
30. Label7.BackColor = vbBlue
31. Label12.BackColor = vbRed
32. Label11.BackColor = vbGreen
33. Label10.BackColor = vbBlue
34. Label4.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
35. Label8.BackColor = RGB(HScroll4.Value, HScroll5.Value, HScroll6.Value)
36. Dim R1&, G1&, B1&
37. If (HScroll1.Value > HScroll4.Value) Then R1 = HScroll1.Value Else R1 = HScroll4.Value
38. If (HScroll2.Value > HScroll5.Value) Then G1 = HScroll2.Value Else G1 = HScroll5.Value
39. If (HScroll3.Value > HScroll6.Value) Then B1 = HScroll3.Value Else B1 = HScroll6.Value
40. Label9.BackColor = RGB(R1, G1, B1)
41. Label12.Caption = R1
42. Label11.Caption = G1
43. Label10.Caption = B1
44.
45. Else '''''''''''''''''''''''''''''''' Tru' Màu
46. Label1.BackColor = vbCyan
47. Label5.BackColor = vbCyan
48. Label2.BackColor = vbMagenta
49. Label6.BackColor = vbMagenta
50. Label3.BackColor = vbYellow
51. Label7.BackColor = vbYellow
52. Label12.BackColor = vbCyan
53. Label11.BackColor = vbMagenta
54. Label10.BackColor = vbYellow
55. Label4.BackColor = RGB(255 - HScroll1.Value, 255 - HScroll2.Value, 255 - HScroll3.Value)
56. Label8.BackColor = RGB(255 - HScroll4.Value, 255 - HScroll5.Value, 255 - HScroll6.Value)
57. Dim R2&, G2&, B2&
58. If (HScroll1.Value > HScroll4.Value) Then R2 = HScroll1.Value Else R2 = HScroll4.Value
59. If (HScroll2.Value > HScroll5.Value) Then G2 = HScroll2.Value Else G2 = HScroll5.Value
60. If (HScroll3.Value > HScroll6.Value) Then B2 = HScroll3.Value Else B2 = HScroll6.Value
61. Label9.BackColor = RGB(Abs(R2 - 255), Abs(G2 - 255), Abs(B2 - 255))
62. Label12.Caption = R2
63. Label11.Caption = G2
64. Label10.Caption = B2
65.
66. End If
67. End Sub
68.
69. Private Sub HScroll1_Change()
70. Màu
71. End Sub
72. Private Sub HScroll2_Change()
73. Màu
74. End Sub
75. Private Sub HScroll3_Change()
76. Màu
77. End Sub
78. Private Sub HScroll4_Change()
79. Màu
80. End Sub
81. Private Sub HScroll5_Change()
82. Màu
83. End Sub
84. Private Sub HScroll6_Change()
85. Màu
86. End Sub
* Hệ màu 24 bit
Kiểu hệ màu RGB chúng ta đang xét ở bài trên là hệ màu 24 bit:
Mỗi màu đơn thành phần có 8 bit: 2^8 = 256 giá trị
RGB([0-255], [0-255], [0-255])
Tổng hợp 3 thành phần màu đơn, trong hệ màu 24 bit ta có 2^(8*3=24) = 16777216 màu
hệ màu 24 bit là hệ màu thật
[Lưu ý rằng mắt thường không phân biệt nổi các tông màu xê xích 1 đơn vị trong hơn 16 triệu màu trên,
ví dụ màu trắng 16777215 (FFFFFF), màu trắng 19777214 (FFFFFE), màu trắng 16776959 (FFFEFF), màu trắng 16711679 (FEFFFF)]
* Hệ màu 32 bit
Hệ màu 32 bit thực chất cũng là hệ màu 24 bit, 8 bit dư
- hoặc không sử dụng
- hoặc sử dụng cho độ trong suốt, ký hiệu là Alpha nên hệ màu 32 bit có lúc còn gọi là hệ màu RGBA
* Hệ màu 48 bit
Mỗi màu đơn thành phần có đến 16 bit: 2^16 = 65536 giá trị
Tổng hợp 3 thành phần màu đơn, trong hệ màu 48 bit ta có 2^(16*3=48) = 281474976710656 màu
(hơn 280 triệu triệu = hơn 280 ngàn tỉ màu khiếp thật!)
Nghe nói hệ màu nầy được dùng trong Photoshop của Adobe
Để các bạn có thể hình dung rõ hơn, tôi minh họa như sau:
ứng với mỗi màu trong hệ RGB 24 bit, hệ màu 48 bit chia nhỏ thêm thành 16777216 màu
(hệ màu 24 bit 16777216 * 16777216 = 281.474.976.710.656 màu hệ 48 bit)
* Hệ màu 16 bit
- hệ 555 (15 bit)
Mỗi màu đơn thành phần có đến 5 bit: 2^5 = 32 giá trị
Tổng hợp 3 thành phần màu đơn, trong hệ màu 15 bit ta có 2^(5*3=15) = 32768 màu
- hệ 565 (16 bit):
thành phần Lục (Green) được 6 bit (vì mắt có thể cảm nhận màu này tốt hơn so với các màu khác)
2 thành phần còn lại, mỗi có 5 bit
Tổng hợp 3 thành phần màu đơn, trong hệ màu 16 bit ta có 2^(16) = 65536 màu
Bạn nào có card VGA yếu, nên chọn hệ màu nầy để đở hao tài nguyên máy. Hình xem vẫn đẹp (hay do tôi mắt kém?)
* Hệ màu 8 bit có 256 màu, 4 bit có 16 màu, 1 bit có 2 màu (đen-trắng)
Mấy hệ bé tí nầy tôi ít tường
Sưu tầm