Windows桌面应用程序(1-2-4-8th) 在Direct2D中使用颜色

Direct2D使用RGB颜色模型,通过组合红色,绿色和蓝色的不同值来形成颜色。第四个组件alpha测量像素的透明度。在Direct2D中,这些组件中的每一个都是一个范围为[0.0-1.0]的浮点值。对于三种颜色成分,该值测量颜色的强度。对于alpha分量,0.0表示完全透明,1.0表示完全不透明。下表显示了100%强度的各种组合产生的颜色。

绿色蓝色颜色
000黑色
100
010绿色
001蓝色
011青色
101品红
110黄色
111白色

这里写图片描述
显示RGB颜色的图像。

0到1之间的颜色值导致这些纯色的不同阴影。Direct2D使用D2D1_COLOR_F结构来表示颜色。例如,以下代码指定洋红色。

// Initialize a magenta color.
D2D1_COLOR_F clr;
clr.r=1;
clr.g=0;
clr.b=1;
clr.a=1;// Opaque.

您还可以使用从D2D1_COLOR_F结构派生的D2D1::ColorF类指定颜色。

// Equivalent to the previous example.
D2D1::ColorF clr(1,0,1,1);

阿尔法混合
通过使用以下公式将前景色与背景色混合,Alpha混合创建半透明区域。
=αfCf+(1αf)Cb 颜 色 = α f C f + ( 1 − α f ) C b
其中Cb是背景色,Cf是前景色,αf是前景色的α值。这个公式被成对地应用于每个颜色分量。例如,假设前景色为(R=1.0,G=0.4,B=0.0),alpha=0.6,背景色为(R=0.0,G=0.5,B=1.0)。由此产生的alpha混合的颜色是:
R=(1.0×0.6+0×0.4)=0.6 R = ( 1.0 × 0.6 + 0 × 0.4 ) = 0.6
G=(0.4×0.6+0.5×0.4)=0.44 G = ( 0.4 × 0.6 + 0.5 × 0.4 ) = 0.44
B=(0×0.6+1.0×0.4)=0.40 B = ( 0 × 0.6 + 1.0 × 0.4 ) = 0.40
下图显示了这种混合操作的结果。
这里写图片描述
显示alpha混合的图像。

像素格式
D2D1_COLOR_F结构没有描述如何在内存中表示像素。在大多数情况下,这并不重要。Direct2D处理将颜色信息转换为像素的所有内部细节。但是,如果直接在内存中使用位图,或者将Direct2D与Direct3D或GDI结合使用,则可能需要了解像素格式。
DXGI_FORMAT枚举定义了一个像素格式的列表。该列表相当长,但其中只有少数与Direct2D相关。(其他的被Direct3D使用)。

像素格式描述
DXGI_FORMAT_B8G8R8A8_UNORM这是最常见的像素格式。所有像素分量(红色,绿色,蓝色和阿尔法)都是8位无符号整数。这些组件按照BGRA顺序排列在内存中。(见下图)
DXGI_FORMAT_R8G8B8A8_UNORM像素分量是8位无符号整数,按RGBA顺序排列。换句话说,相对于DXGI_FORMAT_B8G8R8A8_UNORM,红色和蓝色组件被交换。这种格式仅支持硬件设备。
DXGI_FORMAT_A8_UNORM这种格式包含一个8位的alpha分量,没有RGB分量。这对创建不透明蒙版非常有用。要详细了解如何在Direct2D中使用不透明蒙版,请参阅兼容的A8渲染目标概述

下图显示了BGRA像素布局。
这里写图片描述
显示BGRA像素布局的图表。

要获取渲染目标的像素格式,请调用ID2D1RenderTarget::GetPixelFormat。像素格式可能与显示分辨率不匹配。例如,即使渲染目标使用32位颜色,显示器也可能设置为16位颜色。
阿尔法模式
渲染目标也有一个alpha模式,它定义了如何处理alpha值。

Alpha模式应将描述
D2D1_ALPHA_MODE_IGNORE不执行阿尔法混合。Alpha值被忽略。
D2D1_ALPHA_MODE_STRAIGHT直的阿尔法。像素的颜色分量表示alpha混合之前的颜色强度。
D2D1_ALPHA_MODE_PREMULTIPLIED预乘alpha。像素的颜色分量表示颜色强度乘以阿尔法值。由于alpha混合公式中的项(αf×Cf)是预先计算的,因此此格式比直接alpha更有效。但是,这种格式不适合存储在图像文件中。

这里是直接alpha和预乘alpha的区别的一个例子。假设所需的颜色是纯红色(100%强度)和50%的alpha。作为Direct2D类型,此颜色将表示为(1,0,0,0.5)。使用直接alpha,并假设8位颜色分量,像素的红色分量是0xFF。使用预乘alpha,将红色分量缩放50%,等于0x80。
D2D1_COLOR_F数据类型始终使用直的alpha值表示颜色。如果需要,Direct2D会将像素转换为预乘alpha格式。
如果您知道程序不会执行任何Alpha混合,请使用D2D1_ALPHA_MODE_IGNORE alpha模式创建渲染目标。这种模式可以提高性能,因为Direct2D可以跳过alpha计算。有关更多信息,请参阅改善Direct2D应用程序的性能
下一个
在Direct2D中应用转换


原文链接:Using Color in Direct2D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值