Picturebox滑块控制透明度
我在我的表单中有一个PictureBox并在其中加载图像。
我需要这个PictureBox来改变透明度(opacity,visibilit..etc),因为我需要用户更好地看到这个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 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, rX, rY, r.Width, r.Height, GraphicsUnit.Pixel, imageAtt); return bmpOut; }
请注意, ColorMatrix
其元素为缩放因子,其中1
为标识。 TrackBar.Value
从0-255
到0-255
,就像Bitmap
alpha通道一样。
另请注意,该函数会创建一个新的 Bitmap
,这可能会导致GDI
泄漏 。 看来, PictureBox
照顾它; 至少用taskmanger测试它( ‘详细信息’ – 打开GDI-objects列! )显示没有问题:-)
最后的注意事项: 当且仅当 PictureBox
嵌套在控件’后面’时才会有效! 如果它只是重叠,这将无法正常工作!! 在我的例子中,它位于一个TabPage
,这是一个Container
,你放在它上面的任何东西都嵌套在里面。 如果我把它放到Panel
上,它的工作原理会一样。 但PictureBoxes
不是容器。 因此,如果您希望在其后面显示另一个PictureBox
,那么您需要使用代码来创建嵌套: pboxTop.Parent = pBoxBackground; pboxTop.Location = Point.Empty;
pboxTop.Parent = pBoxBackground; pboxTop.Location = Point.Empty;