Picturebox滑块控制透明度

时间:2017-06-25 19:36:42

标签: c# transparency picturebox opacity

我在我的表单中有一个PictureBox并在其中加载图像。

我需要这个PictureBox来改变透明度(opacity,visibilit..etc),因为我需要用户更好地看到这个PictureBox背后的图像,所以当他想要时,他只需拖动控制滑块,图像开始一步一步地转向看不见,直到他发现它没问题,让我们说透明度为50%。

我添加了控制滑块,但无法找到完成剩余工作的方法。我试过了pictureBox.Opacity,pictureBox.Transparency,没什么用。

1 个答案:

答案 0 :(得分:6)

在winforms中,您必须修改PictureBox.Image

要快速执行此操作,请使用ColorMatrix

以下是一个例子:

enter image description here

跟踪栏代码:

Image original = null;

private void trackBar1_Scroll(object sender, EventArgs e)
{
    if (original == null) original = (Bitmap) pictureBox1.Image.Clone();
    pictureBox1.BackColor = Color.Transparent;
    pictureBox1.Image = SetAlpha((Bitmap)original, trackBar1.Value);
}

要使用ColorMatrix我们需要使用此子句:

using System.Drawing.Imaging;

现在为SetAlpha功能;请注意,它基本上是来自MS link ..:

的克隆
static Bitmap SetAlpha(Bitmap bmpIn, int alpha)
{
    Bitmap bmpOut = new Bitmap(bmpIn.Width, bmpIn.Height);
    float a = alpha /  255f;
    Rectangle r = new Rectangle(0, 0, bmpIn.Width, bmpIn.Height);

    float[][] matrixItems = { 
        new float[] {1, 0, 0, 0, 0},
        new float[] {0, 1, 0, 0, 0},
        new float[] {0, 0, 1, 0, 0},
        new float[] {0, 0, 0, a, 0}, 
        new float[] {0, 0, 0, 0, 1}};

    ColorMatrix colorMatrix = new ColorMatrix(matrixItems);

    ImageAttributes imageAtt = new ImageAttributes();
    imageAtt.SetColorMatrix( colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

    using (Graphics g = Graphics.FromImage(bmpOut))
        g.DrawImage(bmpIn, r, r.X, r.Y, r.Width, r.Height, GraphicsUnit.Pixel, imageAtt);

    return bmpOut;
}

请注意ColorMatrix期望其元素是以1为标识的缩放因子。 TrackBar.Value来自0-255,就像Bitmap alpha 频道一样。

另请注意,该功能会创建 Bitmap,这可能会导致GDI 泄露。看来,PictureBox照顾它;至少使用taskmanger进行测试('详细信息' - 打开GDI-objects列!)显示没有问题: - )

最后注意事项:如果且仅当 PictureBox 嵌套在控件后面时才会有效它!如果只是重叠,这将无法正常工作!!在我的示例中,它位于TabPage,这是Container,您放在它上面的任何东西都嵌套在里面。如果我将它放到Panel上,它的工作原理会相同。但PictureBoxes不是容器。因此,如果您希望其他PictureBox显示在其后面,那么您需要代码来创建嵌套:pboxTop.Parent = pBoxBackground; pboxTop.Location = Point.Empty;