Цвет

Для работы с цветом в MQL5 API существует 3 встроенных функции: две из них — для преобразования типа color в строку и обратно, и одна — для получения специального представления цвета с прозрачностью (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'0,0,255', true)); // clrBlue
   Print(ColorToString(C'0,0,250'));       // 0,0,250
   Print(ColorToString(C'0,0,250', true)); // 0,0,250 (нет имени для этого цвета)
   Print(ColorToString(0x34AB6821true)); // 33,104,171 (0x21,0x68,0xAB)
}

 

color StringToColor(string text)

Функция StringToColor преобразует строку вида "R,G,B" или строку, содержащую наименование стандартного web-цвета, в значение типа color. Если в строке не содержится правильно отформатированной тройки чисел или названия цвета, функция вернет 0 (clrBlack).

Примеры можно увидеть в скрипте ConversionColor.mq5.

void OnStart()
{
   Print(StringToColor("0,0,255")); // clrBlue
   Print(StringToColor("clrBlue")); // clrBlue
   Print(StringToColor("Blue"));    // clrBlack (нет цвета с таким именем)
   // лишний текст игнорируется
   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.
 
Но в ряде задач требуется указание прозрачности цвета, чтобы описать, каким образом будет выглядеть изображение при наложении на некоторый фон (другое, уже существующее изображение). Для таких случаев вводится понятие альфа-канала, который кодируется дополнительным байтом.
 
Представление цвета в формате ARGB вместе с альфа-каналом (обозначен AA) имеет вид: 0xAARRGGBB. Например, значение 0x80FFFF00 означает желтый (за счет красной и зеленой компонент) полупрозрачный цвет.

При наложении изображения с альфа-каналом на некоторый фон получается результирующий цвет:

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
   */
}

Функцию PrintFormat мы рассмотрим чуть позже в соответствующем разделе.

Для обратного преобразования ARGB в color встроенной функции нет (поскольку обычно оно не требуется), но желающие могут воспользоваться следующим макросом:

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