颜色

MQL5 API 包含用于处理颜色的 3 个内置函数:其中两个用于 颜色 类型与字符串之间的相互转换,第三个用于提供带透明度的特殊颜色表示 (ARGB)。

string ColorToString(color value, bool showName = false)

ColorToString 函数将传递的颜色 value 转换为诸如 "R,G,B" 的字符串(其中 R、G、B 是 0 到 255 的数字,对应于颜色中红、绿、蓝分量的强度),或者对应于预定义 web 颜色 列表中的颜色名称(如果 showName 参数等于 true)。仅当颜色值完全匹配某个 web 设置颜色值时,才会返回颜色名称。

该函数的使用示例在 ConversionColor.mq5 脚本中提供。

void OnStart()
{
   Print(ColorToString(clrBlue));            // 0,0,255
   Print(ColorToString(C'00255', true)); // clrBlue
   Print(ColorToString(C'00250'));       // 0,0,250
   Print(ColorToString(C'00250', true)); // 0,0,250 (no name for this color)
   Print(ColorToString(0x34AB6821true));   // 33,104,171 (0x21,0x68,0xAB)
}

 

color StringToColor(string text)

StringToColor 函数将诸如 "R,G,B" 的字符串或者包含标准 web 颜色 的字符串转换为 颜色类型值。如果字符串未包含格式正确的数字三元组或颜色名称,则函数将返回 0 (clrBlack)。

示例参见脚本 ConversionColor.mq5

void OnStart()
{
   Print(StringToColor("0,0,255")); // clrBlue
   Print(StringToColor("clrBlue")); // clrBlue
   Print(StringToColor("Blue"));    // clrBlack (no color with that name)
   // extra text will be ignored
   Print(StringToColor("255,255,255 more text"));      // clrWhite
   Print(StringToColor("This is color: 128,128,128")); // clrGray
}

 

uint ColorToARGB(color value, uchar alpha = 255)

ColorToARGB 函数将 color 类型值以及单字节值 alpha(指定透明度)转换为 ARGB 颜色表示(uint 类型值)。ARGB 颜色格式用于创建 图形资源 以及 文本图 (在 图表上)。

alpha 值介于 0 到 255 之间。"0" 对应全颜色透明度(当显示此颜色的像素时,会让该点的现有图像保持不变),255 表示应用全颜色浓度(当显示该颜色的像素时,会完全替换对应点的图像颜色)。值 128 (0x80) 为半透明。

如我们所知,color 类型使用三个颜色分量描述颜色:红色 (Red)、绿色 (Green) 以及蓝色 (Blue),分量以 0x00BBGGRR 的格式存储在 4 字节整数 (uint) 中。每个分量是一个指定对应颜色饱和度的字节,范围 0 到 255(十六进制则为 0x00 到 0xFF)。最高字节为空。例如,白色包含所有颜色,因此白色的 color 含义等于 0xFFFFFF。
 
但在某些任务中,需要指定颜色透明度,以描述当叠加在某个背景(另一个已存在的图像)上时的图像显示方式。为此,引入了 alpha 通道的概念,该通道由一个额外字节编码。
 
含 alpha 通道(以 AA 表示)的 ARGB 颜色表示为 0xAARRGGBB。例如,值 0x80FFFF00 表示黄色(红色和绿色分量混合)半透明颜色。

当具有 alpha 通道的图像叠加到某个背景上时,获得最终的颜色:

Cresult = (Cforeground * alpha + Cbackground * (255 - alpha)) / 255

其中 C 分别取每个 R、G、B 分量的值。该公式供参考。使用具有 ARGB 颜色的内置函数时,自动应用透明度。

ColorToARGB 应用示例在 ConversionColor.mq5 中提供。辅助结构体 Argb 和联合体 ColorARGB 已添加到脚本中,以便于分析颜色分量。

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) { }
};

该结构体用作联合体中的 split 类型字段,并提供按名称的 ARGB 分量访问。该联合体也具有字节数组 channels,允许你按索引访问分量。

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(clrDeepSkyBlue0x40);
   PrintFormat("ARGB2=%X"u); // ARGB2=4000BFFF
   ColorARGB clr2(u);
   ArrayPrint(clr2.split);
   /*
       [BB] [GG] [RR] [AA]
   [0]  255  191    0   64
   */
}

稍后我们讨论 print format 函数(在相应 章节讨论)。

没有内置函数可将 ARGB 转换回 color(因为通常不需要),但如果希望这样做,可使用以下宏:

#define ARGBToColor(U) (color) \
   ((((U) & 0xFF) << 16) | ((U) & 0xFF00) | (((U) >> 16) & 0xFF))