ColorToPRGB

将类型 color 转换为类型uint 以获得 ARGB 颜色表示的预乘形式 - PRGB。PRGB 颜色格式在创建图形资源文本输出和标准库中的 CCanvas 类时以COLOR_FORMAT_ARGB_RAW  (组成不是由终端处理的,必须由用户正确准备)为参数时使用。

uint  ColorToPRGB(
   color  clr,          // 转换的 color 格式的颜色
   uchar  alpha=255     // 控制颜色透明度的 alpha 通道
   );

参数

clr

[in] color 类型的颜色值。

alpha

[in] alpha 通道的值,以获得ARGB格式的颜色。它的值可设置为从 0(叠加像素的颜色根本不会改变底层像素的显示)到 255(颜色完全叠加并与底层像素的颜色重叠)。以百分比表示的颜色透明度计算为(1-alpha/255)*100%,即 alpha 通道值越低,颜色越透明。

返回值

ARGB 格式的颜色表示,其中四个字节的 uint 类型包含值 Alpha、Red、Green、Blue(alpha 通道、红色、绿色、蓝色)。

请注意

PRGB 与 ARGB 有何不同?

RGBA 颜色有两种常见的 alpha 通道表示方式:

  • 直接(正常)ARGB - RGB 按“原样”存储,alpha 单独存储;
  • 预乘(PRGB)- RGB 已经乘以 alpha。

模式COLOR_FORMAT_ARGB_RAW假设颜色分量已经正确准备,终端不会“归一化/重新计算”它们。因此,在预期预乘颜色的场景中,应该传递 PRGB,否则渲染过程中可能会出现视觉伪影/不匹配。

PRGB 颜色由以下公式计算:

R = R * A / 255

G = G * A / 255

B = B * A / 255

A = A 

特殊情况:

  • 当 alpha=255 时,结果与 ColorToARGB(clr,255) 一致(乘法不改变RGB);
  • 当 alpha = 0 时,结果变为 0x00000000(完全透明像素,RGB = 0)。

示例:

//+------------------------------------------------------------------+
//| 脚本程序起始函数                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uchar alpha = 0x55// 0x55 = 85; 透明度约等于 (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)
   */
}

参见

资源, ColorToARGB, ResourceCreate(), TextOut(), Color 类型, char, short, int 和 long 类型