设置单个像素的 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::GetPixel 和 Bitmap::SetPixel 使你可以控制各个像素值。 但是,使用 Bitmap::GetPixel 和 Bitmap::SetPixel 的速度不如使用 ImageAttributes 类和 ColorMatrix 结构快。