65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 GDI+ 进行 Alpha 混合

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.42/5 (19投票s)

2005年3月6日

4分钟阅读

viewsIcon

162601

downloadIcon

3176

Alpha 混合允许两个对象在视觉上混合在一起。本文简要解释了 Alpha 混合技术以及如何使用 GDI+ 来实现它。

[使用演示项目,您可以插入任何图像并控制图像的透明度,甚至可以将最终图像保存为不同的文件。您还可以选择一个基图像作为背景图像,您可以在其上插入图像。但您无法控制基图像的透明度。要选择基图像,请选择 File->Open Base Image 菜单并选择所需的图像。要插入图像,请选择 Insert->Image 菜单项并选择图像。]

引言

Alpha 混合允许两个对象在视觉上混合在一起。这主要用于 3D 大气和环境效果。它允许诸如“雾化”之类的效果,其中一个图像渲染在另一个半透明图像的后面,从而产生透过雾观看或透过水池向下看并看到底部效果。它还允许深度提示,即降低照明强度以使对象看起来更远。

在计算机图形学中,每个像素都有三个颜色信息通道——红色、绿色和蓝色——有时还有一个称为 alpha 通道的第四个通道。这个第四个通道控制其他图形信息的显示方式,例如透明度或不透明度级别。Alpha 混合是此类控制的名称,它用于模拟诸如将一块玻璃放在对象前面,以便对象在玻璃后面完全可见、不可见或介于两者之间的效果。

图 1:Alpha 混合过程

Alpha 混合可以按像素进行,也可以针对整个图像进行。在逐像素 Alpha 混合中,每个像素都应包含 alpha 分量,并且每个像素的透明度由该值控制。当我们对整个图像进行 Alpha 混合时,将使用相同的 alpha 分量处理整个图像,因此图像中所有像素的透明度都将相同。

使用 GDI+ 进行 Alpha 混合

步骤 1:加载所需的图像

正如下面所示,我们可以使用 GDI+ 提供的强大的 Image 类轻松地从图像文件中构造一个图像对象。

Image img1("Flower1.jpg");
Image img2("Flower2.jpg");

GDI+ 中的 Graphics 类包含多种可用于创建基本图形的方法,例如绘制矩形、填充区域等。但是,要对图像应用 alpha 混合,您需要更多的控制。为此,您将不得不使用 ImageAttributes 类和 ColorMatrix 结构。ImageAttributes 对象通过允许您指定颜色调整、灰度调整等各种设置来控制图形的渲染方式。ColorMatrix 是一个结构,其实例是 ImageAttributes 类的大多数方法中的参数。它包含指定 Alpha、红色、绿色和蓝色通道的值。

因此,下一步是初始化一个颜色矩阵对象,并将其传递给 ImageAttributes 对象的相应方法。

步骤 2:创建 ImageAttributes 和 ColorMatrix 对象

颜色矩阵是一个包含通道值的矩阵。它是一个 5x5 矩阵,按 RGBAw 的顺序表示红色、绿色、蓝色、Alpha 通道和另一个元素 w 的值。

ColorMatrix 对象中,矩阵的对角线元素定义了通道值,即 (0,0)、(1,1)、(2,2)、(3,3) 和 (4,4),顺序如前所述 - RGBAw。值为 float 类型,范围从 0 到 1。元素 w(在 (4,4) 处)始终为 1。

您需要做的是创建一个新的 ColorMatrix 实例,并设置所需的通道值。由于我们要控制 alpha 混合通道,因此应将 (3,3) 处的元素设置为所需值,如下所示。

ColorMatrix ClrMatrix =         { 
            1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
            0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
            0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
            0.0f, 0.0f, 0.0f, 0.5f, 0.0f,
            0.0f, 0.0f, 0.0f, 0.0f, 1.0f
};

上面的代码中的 0.5f 值表示 alpha 混合值。0.5 表示半透明(50%)。

初始化 ColorMatrix 后,您可以创建一个新的 ImageAttributes 对象,并将新创建的 ColorMatrix 分配给它。这可以通过调用 ImageAttributes 对象上的 SetColorMatrix 方法来完成。例如,以下代码创建一个新的 ImageAttributes 对象,并将其颜色矩阵设置为刚刚创建的矩阵。

ImageAttributes ImgAttr;

ImgAttr.SetColorMatrix(&ClrMatrix, ColorMatrixFlagsDefault, 
                        ColorAdjustTypeBitmap);

最后一步是使用刚刚创建的 ImageAttributes 对象绘制原始图像。使用此 ImageAttributes 对象,ImageAttributes 对象将使用我们在颜色矩阵中设置的 alpha 值绘制原始图像,从而创建 alpha 图像。

步骤 3:Alpha 混合图像

由于我们需要将 img2 混合到 img1 上,我们首先应该使用 Graphics.DrawImage 方法的最简单重载在所需的 Graphics 上绘制 img1,如下所示。

g.DrawImage(&img1, 0,0,img1.Width,img1.Height);

要将图像 img2 Alpha 混合到 img1 上,我们调用 Graphics 对象上的 Graphics.DrawImage 方法的重载之一,该方法接受一个 ImageAttributes 对象,通过该对象我们可以指定渲染修改。例如,以下代码在指定位置绘制图像 img2,并在 Graphics 对象 g 上使用 ImageAttributes 对象 ImgAttr

g.DrawImage(&img2, RectF destination(0,0, img2.Width,img2.Height), 0,0, 
                  img2.Width,img2.Height,UnitPixel,&ImgAttr);

现在,Graphics 对象上的结果图像代表了 Img2Img1 上的 Alpha 混合结果。

(Graphics 对象可以是任何图形对象,它可以从控件获取,也可以从图像创建等等。)

历史

发布日期:2005 年 3 月 6 日。

© . All rights reserved.