Màu Sắc
API MQL5 chứa 3 hàm tích hợp để làm việc với màu sắc: hai hàm dùng để chuyển đổi kiểu color
thành chuỗi và ngược lại, và hàm thứ ba cung cấp biểu diễn màu đặc biệt với độ trong suốt (ARGB).
string ColorToString(color value, bool showName = false)
Hàm ColorToString
chuyển đổi giá trị màu value
được truyền vào thành chuỗi dạng "R,G,B" (trong đó R, G, B là các số từ 0 đến 255, tương ứng với cường độ của thành phần màu đỏ, xanh lá và xanh dương trong màu) hoặc thành tên màu từ danh sách các màu web được định nghĩa trước nếu tham số showName
bằng true
. Tên màu chỉ được trả về nếu giá trị màu khớp chính xác với một màu trong bộ màu web.
Ví dụ sử dụng hàm được cung cấp trong script ConversionColor.mq5
:
void OnStart()
{
Print(ColorToString(clrBlue)); // 0,0,255
Print(ColorToString(C`0, 0, 255`, true)); // clrBlue
Print(ColorToString(C`0, 0, 250`)); // 0,0,250
Print(ColorToString(C`0, 0, 250`, true)); // 0,0,250 (không có tên cho màu này)
Print(ColorToString(0x34AB6821, true)); // 33,104,171 (0x21,0x68,0xAB)
}
2
3
4
5
6
7
8
color StringToColor(string text)
Hàm StringToColor
chuyển đổi một chuỗi dạng "R,G,B" hoặc chuỗi chứa tên của một màu web tiêu chuẩn thành giá trị kiểu color
. Nếu chuỗi không chứa bộ ba số được định dạng đúng hoặc tên màu, hàm sẽ trả về 0 (clrBlack
).
Ví dụ có thể xem trong script ConversionColor.mq5
:
void OnStart()
{
Print(StringToColor("0,0,255")); // clrBlue
Print(StringToColor("clrBlue")); // clrBlue
Print(StringToColor("Blue")); // clrBlack (không có màu với tên này)
// văn bản thừa sẽ bị bỏ qua
Print(StringToColor("255,255,255 more text")); // clrWhite
Print(StringToColor("This is color: 128,128,128")); // clrGray
}
2
3
4
5
6
7
8
9
uint ColorToARGB(color value, uchar alpha = 255)
Hàm ColorToARGB
chuyển đổi một giá trị kiểu color
và giá trị một byte alpha
(xác định độ trong suốt) thành biểu diễn ARGB của màu (giá trị kiểu uint
). Định dạng màu ARGB được sử dụng khi tạo tài nguyên đồ họa và vẽ văn bản trên biểu đồ.
Giá trị alpha
có thể dao động từ 0 đến 255. "0" tương ứng với màu hoàn toàn trong suốt (khi hiển thị một pixel của màu này, nó giữ nguyên hình ảnh biểu đồ hiện tại tại điểm đó), 255 có nghĩa là áp dụng mật độ màu đầy đủ (khi hiển thị một pixel của màu này, nó thay thế hoàn toàn màu của biểu đồ tại điểm tương ứng). Giá trị 128 (0x80) là bán trong suốt.
Như chúng ta biết, kiểu
color
mô tả một màu bằng ba thành phần màu: đỏ (Red), xanh lá (Green) và xanh dương (Blue), được lưu trữ ở định dạng 0x00BBGGRR trong một số nguyên 4 byte (uint
). Mỗi thành phần là một byte xác định độ bão hòa của màu đó trong phạm vi từ 0 đến 255 (0x00 đến 0xFF trong hệ thập lục phân). Byte cao nhất để trống. Ví dụ, màu trắng chứa tất cả các màu và do đó có giá trịcolor
bằng 0xFFFFFF.Nhưng trong một số tác vụ, cần chỉ định độ trong suốt của màu để mô tả cách hình ảnh sẽ trông như thế nào khi được phủ lên một nền nào đó (trên một hình ảnh đã tồn tại khác). Trong những trường hợp như vậy, khái niệm kênh alpha được giới thiệu, được mã hóa bằng một byte bổ sung.
Biểu diễn màu ARGB, cùng với kênh alpha (ký hiệu AA), là 0xAARRGGBB. Ví dụ, giá trị 0x80FFFF00 biểu thị màu vàng (hỗn hợp của thành phần đỏ và xanh lá) với độ trong suốt bán phần.
Khi phủ một hình ảnh có kênh alpha lên một nền nào đó, màu kết quả được tính như sau:
Cresult = (Cforeground * alpha + Cbackground * (255 - alpha)) / 255
Trong đó, C lần lượt lấy giá trị của từng thành phần R, G, B. Công thức này được cung cấp để tham khảo. Khi sử dụng các hàm tích hợp với màu ARGB, độ trong suốt được áp dụng tự động.
Ví dụ ứng dụng của ColorToARGB
được đưa ra trong ConversionColor.mq5
. Một cấu trúc phụ trợ Argb
và liên hợp ColorARGB
đã được thêm vào script để tiện phân tích các thành phần màu:
struct Argb
{
uchar BB;
uchar GG;
uchar RR;
uchar AA;
};
union ColorARGB
{
uint value;
uchar channels[4]; // 0 - BB, 1 - GG, 2 - RR, 3 - AA
Argb split[1];
ColorARGB(uint u) : value(u) { }
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Cấu trúc này được sử dụng làm trường kiểu split
trong liên hợp và cung cấp quyền truy cập vào các thành phần ARGB theo tên. Liên hợp cũng có một mảng byte channels
, cho phép truy cập các thành phần theo chỉ số.
void OnStart()
{
uint u = ColorToARGB(clrBlue);
PrintFormat("ARGB1=%X", u); // ARGB1=FF0000FF
ColorARGB clr1(u);
ArrayPrint(clr1.split);
/*
[BB] [GG] [RR] [AA]
[0] 255 0 0 255
*/
u = ColorToARGB(clrDeepSkyBlue, 0x40);
PrintFormat("ARGB2=%X", u); // ARGB2=4000BFFF
ColorARGB clr2(u);
ArrayPrint(clr2.split);
/*
[BB] [GG] [RR] [AA]
[0] 255 191 0 64
*/
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Chúng ta sẽ xem xét hàm print format
sau, trong phần tương ứng.
Không có hàm tích hợp để chuyển đổi ARGB ngược lại thành color
(vì điều này thường không cần thiết), nhưng những ai muốn làm điều đó có thể sử dụng macro sau:
#define ARGBToColor(U) (color) \
((((U) & 0xFF) << 16) | ((U) & 0xFF00) | (((U) >> 16) & 0xFF))
2