繁体   English   中英

Picturebox滑块控件的透明度

[英]Picturebox slider control transparency

我的窗体中有一个PictureBox,并在其中加载了图像。

我需要此PictureBox来更改透明度(不透明度,可见性等),因为我需要用户更好地查看此PictureBox背后的图像,因此,当他需要时,他只需拖动控件滑块,图像就开始变得不可见,一步一步,直到他确定还可以,再说50%的透明度。

我添加了控制滑块,但找不到其他方法。 我尝试了pictureBox.Opacity,pictureBox.Transparency,没有任何效果。

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

要快速完成此操作,请使用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);
}

要使用ColorMatrix我们需要以下using子句:

using System.Drawing.Imaging;

现在使用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;
}

请注意, ColorMatrix期望其元素为比例因子,其中1为标识。 TrackBar.Value0-255 ,就像Bitmap alpha通道一样。

另请注意,该函数将创建一个新的 Bitmap ,这可能会导致GDI 泄漏 似乎在这里PictureBox会处理它; 至少用taskmanger进行测试( ' Details'- 打开GDI-objects列! )显示没有问题:-)

最后说明: 仅当 PictureBox 嵌套在控件“后面”时,此方法起作用! 如果只是重叠,将无法使用!! 在我的示例中,它位于TabPageTabPage是一个Container ,放置在它上面的任何内容都嵌套在其中。 如果将它放到Panel上,它的工作原理相同。 但是PictureBoxes不是容器。 因此,如果要在其后显示另一个PictureBox ,则需要代码来创建嵌套: pboxTop.Parent = pBoxBackground; pboxTop.Location = Point.Empty; pboxTop.Parent = pBoxBackground; pboxTop.Location = Point.Empty;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM