设置单个像素的 Alpha 值

主题 使用颜色矩阵设置图像中的 Alpha 值 演示了用于更改图像的 alpha 值的非破坏性方法。 该主题中的示例以半透明方式呈现图像,但位图中的像素数据未更改。 alpha 值仅在呈现期间更改。

以下示例演示如何更改单个像素的 alpha 值。 示例中的代码实际上更改了 Bitmap 对象中的 alpha 信息。 此方法比使用颜色矩阵和 ImageAttributes 对象慢得多,但让你可以控制位图中的各个像素。

INT iWidth = bitmap.GetWidth();
INT iHeight = bitmap.GetHeight();
Color color, colorTemp;
for(INT iRow = 0; iRow < iHeight; iRow++)
{
   for(INT iColumn = 0; iColumn < iWidth; iColumn++)
   {
      bitmap.GetPixel(iColumn, iRow, &color);
      colorTemp.SetValue(color.MakeARGB(
         (BYTE)(255 * iColumn / iWidth), 
         color.GetRed(),
         color.GetGreen(),
         color.GetBlue()));
      bitmap.SetPixel(iColumn, iRow, colorTemp);
   }
}
// First draw a wide black line.
Pen pen(Color(255, 0, 0, 0), 25);
graphics.DrawLine(&pen, 10, 35, 200, 35);
// Now draw the modified bitmap.
graphics.DrawImage(&bitmap, 30, 0, iWidth, iHeight);

下图显示了生成的图像。

插图显示从左到右在黑色矩形上变得更加不透明的图像

前面的代码示例使用嵌套循环来更改位图中每个像素的 alpha 值。 对于每个像素, Bitmap::GetPixel 获取现有颜色, Color::SetValue 创建包含新 alpha 值的临时颜色,然后 Bitmap::SetPixel 设置新颜色。 alpha 值是根据位图的列设置的。 在第一列中,alpha 设置为 0。 在最后一列中,alpha 设置为 255。 因此,生成的图像从左边缘的完全透明 () 到右边缘) 完全不透明 (。

Bitmap::GetPixelBitmap::SetPixel 使你可以控制各个像素值。 但是,使用 Bitmap::GetPixelBitmap::SetPixel 的速度不如使用 ImageAttributes 类和 ColorMatrix 结构快。