Bru*_*go 2 c# transparency picturebox opacity
我的表单中有一个PictureBox,并在其中加载图像.
我需要这个PictureBox来改变透明度(opacity,visibilit..etc),因为我需要用户更好地看到这个PictureBox背后的图像,所以当他想要时,他只需拖动控制滑块,图像开始变得不可见,一步一步,直到他发现它没问题,让我们说透明度为50%.
我添加了控制滑块,但无法找到完成剩下的工作.我试过了pictureBox.Opacity,pictureBox.Transparency,没什么用.
在的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;