ColorToPRGB

Konvertiert den Typ color in den Typ uint, um eine Premultiplied-ARGB-Darstellung der Farbe zu erhalten – PRGB. Das Farbformat PRGB wird bei der Erstellung von Grafikressourcen, Textausgaben und in der CCanvas-Standardbibliotheksklasse mit dem Farbbildformat COLOR_FORMAT_ARGB_RAW verwendet  (Komponenten werden vom Terminal nicht verarbeitet und müssen vom Nutzer korrekt vorbereitet werden).

uint  ColorToPRGB(
   color  clr,          // zu konvertierende Farbe im Format color
   uchar  alpha=255     // Alpha-Kanal, der die Farbtransparenz kontrolliert
   );

Parameter

clr

[in] Wert der Farbe in einer Variablen vom Typ color.

alpha

[in] Wert des Alpha-Kanals, um die Farbe im Format ARGB zu erhalten. Der Wert reicht von 0 (die Farbe des überlagerten Pixels verändert die Darstellung des darunterliegenden Pixels überhaupt nicht) bis 255 (die Farbe wird vollständig überlagert und überdeckt die Farbe des darunterliegenden Pixels). Die Farbtransparenz in Prozent wird wie folgt berechnet: (1-alpha/255)*100 %, d. h. Je niedriger der Wert des Alpha-Kanals, desto transparenter ist die Farbe.

Rückgabewert

Farbdarstellung im ARGB-Format, wobei vier Bytes vom Typ uint die Werte Alfa, Rot, Grün, Blau (Alpha-Kanal, Rot, Grün, Blau) enthalten.

Hinweis

Wie unterscheidet sich PRGB von ARGB?

Es gibt zwei gängige Darstellungen von RGBA-Farben mit einem Alpha-Kanal:

  • straight (normal) ARGB – RGB wird „unverändert“ gespeichert, Alpha ist separat;
  • premultiplied (PRGB) – RGB ist bereits mit Alpha multipliziert.

Der Modus COLOR_FORMAT_ARGB_RAW geht davon aus, dass die Farbkomponenten bereits korrekt vorbereitet sind und das Terminal sie nicht „normalisiert/neu berechnet”. Daher sollte in Szenarien, in denen premultiplied Farben erwartet werden, PRGB übergeben werden, da es sonst zu visuellen Artefakten/Unstimmigkeiten beim Rendern kommen kann.

PRGB-Farben werden nach folgender Formel berechnet:

R = R * A / 255

G = G * A / 255

B = B * A / 255

A = A 

Sonderfälle:

  • Ist alpha = 255, stimmt das Ergebnis mit ColorToARGB(clr,255) überein (die Multiplikation verändert RGB nicht).
  • Ist alpha = 0, wird das Ergebnis zu 0x00000000 (vollständig transparentes Pixel, RGB = 0).

Beispiel:

//+------------------------------------------------------------------+
//| Startfunktionen des Skripts                                      |
//+------------------------------------------------------------------+
void OnStart()
{
   uchar alpha = 0x55// 0x55 = 85; Transparenz ~ (255-85)/255 * 100% = 66.7%
   color c = clrWhite;
 
   PrintFormat("0x%%.8X - %s"cColorToString(c,true));
   PrintFormat("0x%.8X - ARGB (straight)"ColorToARGB(calpha));
   PrintFormat("0x%.8X - PRGB (premultiplied)"ColorToPRGB(calpha));
   /*
   0x00FFFFFF - clrWhite
   0x55FFFFFF - ARGB (straight)
   0x55555555 - PRGB (premultiplied)
   */
}

Siehe auch

Resources, ColorToARGB, ResourceCreate(), TextOut(), Color type, Types char, short, int and long