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