Color

La API de MQL5 contiene 3 funciones integradas para trabajar con el color: dos de ellas sirven para la conversión del tipo color hacia y desde una cadena, y la tercera proporciona una representación especial del color con transparencia (ARGB).

string ColorToString(color value, bool showName = false)

La función ColorToString convierte el color pasado value en una cadena como «R,G,B» (donde R, G, B son números de 0 a 255, correspondientes a la intensidad de los componentes rojo, verde y azul del color) o en el nombre del color de la lista de colores web predefinidos si el parámetro showName es igual a true. El nombre del color sólo se devuelve si el valor del color coincide exactamente con uno de webset.

En el script ConversionColor.mq5 se ofrecen ejemplos de uso de la función.

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)

La función StringToColor convierte una cadena como «R,G,B» o una cadena que contenga el nombre de un color web estándar en un valor de tipo color. Si la cadena no contiene un triplete de números con el formato adecuado o un nombre de color, la función devolverá 0 (clrBlack).

Se pueden ver ejemplos en el script 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)

La función ColorToARGB convierte un valor de tipo color y un valor de un byte alpha (que especifica la transparencia) en una representación ARGB de un color (un valor de tipo uint). El formato de color ARGB se utiliza al crear recursos gráficos como dibujo de texto en gráficos.

El valor alpha puede variar de 0 a 255. «0» corresponde a la transparencia total del color (al mostrar un píxel de este color, deja inalterada la imagen del gráfico existente en este punto), 255 significa aplicar la densidad total del color (al mostrar un píxel de este color, sustituye completamente el color del gráfico en el punto correspondiente). El valor 128 (0x80) es translúcido.

Como sabemos, el tipo color describe un color utilizando tres componentes de color: rojo (Red), verde (Green) y azul (Blue), que se almacenan en el formato 0x00BBGGRR en un entero de 4 bytes (uint). Cada componente es un byte que especifica la saturación de ese color en el rango de 0 a 255 (0x00 a 0xFF en hexadecimal). El byte más alto está vacío. Por ejemplo, el color blanco contiene todos los colores y, por tanto, tiene un significado color igual a 0xFFFFFF.
 
Sin embargo, en determinadas tareas es necesario especificar la transparencia del color para describir el aspecto que tendrá la imagen cuando se superponga sobre algún fondo (sobre otra imagen ya existente). Para estos casos se introduce el concepto de canal alfa, que se codifica mediante un byte adicional.
 
La representación de color ARGB, junto con el canal alfa (AA), es 0xAARRGGBB. Por ejemplo, el valor 0x80FFFF00 significa color amarillo (una mezcla de los componentes rojo y verde) translúcido.

Al superponer una imagen con un canal alfa sobre algún fondo, se obtiene el color resultante:

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

donde C toma el valor de cada uno de los componentes R, G, B, respectivamente. Esta fórmula se facilita como referencia. Cuando se utilizan funciones integradas con colores ARGB, la transparencia se aplica automáticamente.

Un ejemplo de aplicación de ColorToARGB figura en ConversionColor.mq5. Se han añadido al script una estructura auxiliar Argb y la unión ColorARGB para mayor comodidad a la hora de analizar los componentes de color.

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

La estructura se utiliza como campo de tipo split en la unión y proporciona acceso a los componentes ARGB por nombre. La unión también tiene un array de bytes channels, que le permite acceder a los componentes por índice.

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

Veremos la función print format un poco más adelante, en la sección correspondiente.

No existe ninguna función integrada para convertir ARGB de nuevo a color (ya que no suele ser necesario), pero quienes deseen hacerlo, pueden utilizar la siguiente macro:

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