图片框滑块控制透明度
Picturebox slider control transparency
我的表单中有一个 PictureBox 并在其中加载图像。
我需要这个 PictureBox 来改变透明度(不透明度,visibilit..等),因为我需要用户更好地看到这个 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 link..:[=35=] 的克隆
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 通道..
另请注意,该函数会创建一个 new Bitmap
,这可能会导致 GDI
leaking。 PictureBox
似乎在这里处理了它;至少用任务管理器测试它('Details' - 打开 GDI-objects 列!)显示没有问题:-)
最后说明:当且仅当 PictureBox
嵌套 在控件 [=74= 中时,这才有效 ] 它!如果只是 重叠 这将不起作用!!在我的示例中,它位于 TabPage
上,这是一个 Container
,您放在上面的任何东西都会嵌套在里面。如果我把它放到 Panel
上,它的工作原理是一样的。但是 PictureBoxes
不是容器。所以如果你想让另一个 PictureBox
出现在它后面,那么 你需要代码 来创建嵌套:pboxTop.Parent = pBoxBackground; pboxTop.Location = Point.Empty;
我的表单中有一个 PictureBox 并在其中加载图像。
我需要这个 PictureBox 来改变透明度(不透明度,visibilit..等),因为我需要用户更好地看到这个 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);
}
要使用 ColorMatrix
我们需要这个 using 子句:
using System.Drawing.Imaging;
现在是 SetAlpha
函数;请注意,它基本上是 MS link..:[=35=] 的克隆
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 通道..
另请注意,该函数会创建一个 new Bitmap
,这可能会导致 GDI
leaking。 PictureBox
似乎在这里处理了它;至少用任务管理器测试它('Details' - 打开 GDI-objects 列!)显示没有问题:-)
最后说明:当且仅当 PictureBox
嵌套 在控件 [=74= 中时,这才有效 ] 它!如果只是 重叠 这将不起作用!!在我的示例中,它位于 TabPage
上,这是一个 Container
,您放在上面的任何东西都会嵌套在里面。如果我把它放到 Panel
上,它的工作原理是一样的。但是 PictureBoxes
不是容器。所以如果你想让另一个 PictureBox
出现在它后面,那么 你需要代码 来创建嵌套:pboxTop.Parent = pBoxBackground; pboxTop.Location = Point.Empty;