Цвет
Для работы с цветом в 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()
|
color StringToColor(string text)
Функция StringToColor преобразует строку вида "R,G,B" или строку, содержащую наименование стандартного web-цвета, в значение типа color. Если в строке не содержится правильно отформатированной тройки чисел или названия цвета, функция вернет 0 (clrBlack).
Примеры можно увидеть в скрипте ConversionColor.mq5.
void OnStart()
|
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
|
Структура используется в качестве типа поля split в объединении и обеспечивает доступ к компонентам ARGB по именам. Также в объединении имеется байтовый массив channels, который позволяет обращаться к компонентам по индексу.
void OnStart()
|
Функцию PrintFormat мы рассмотрим чуть позже в соответствующем разделе.
Для обратного преобразования ARGB в color встроенной функции нет (поскольку обычно оно не требуется), но желающие могут воспользоваться следующим макросом:
#define ARGBToColor(U) (color) \
|