Picturebox滑块控制透明度

Bru*_*go 2 c# transparency picturebox opacity

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

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

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

TaW*_*TaW 6

在的WinForms,你将不得不修改阿尔法PictureBox.Image.

要快速做到这一点,请使用ColorMatrix!

这是一个例子:

在此输入图像描述

跟踪栏代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

using System.Drawing.Imaging;
Run Code Online (Sandbox Code Playgroud)

现在为SetAlpha功能; 请注意,它基本上是来自MS链接的克隆..:

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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,ColorMatrix期望其元素1是作为标识的缩放因子.在TrackBar.Value从前进0-255,就像一个Bitmap 阿尔法通道..

另请注意,该功能会创建一个新的 Bitmap,这可能会导致GDI 泄漏.在这里,PictureBox照顾它,它似乎; 至少用taskmanger测试它('详细信息' - 打开GDI-objects列!)显示没有问题:-)

最后说明一点:这将工作当且仅当PictureBox嵌套在"背后"它的控制!如果它只是重叠这将无法正常工作!! 在我的例子中,它位于a TabPage,这是一个Container,你放在它上面的东西嵌套在里面.如果我将它放到一个上面,它的工作原理会一样Panel.但是PictureBoxes没有容器.因此,如果您希望其他PictureBox人出现在它后面,那么您需要代码来创建嵌套:pboxTop.Parent = pBoxBackground; pboxTop.Location = Point.Empty;