控件上的透明图像

时间:2018-09-19 13:49:06

标签: c# winforms bitmap

我正在做一个带有启动画面的应用程序。

我有一张要放在进度条下方的图像,例如:

示例

Example

我已成功使位图透明。 但是,现在,图像在进度条后面了

现在

Now

是否可以将图像显示在进度条前面? 谢谢。 F。

代码:

public partial class Form1 : Form
{
    Bitmap m_l;
    public Form1()
    {
        InitializeComponent();

        m_l = Properties.Resources.LU;

        m_l.MakeTransparent(Color.Transparent);
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawImage(m_l, new Rectangle(new Point(0, -40), new Size(200, 264))); progressBar1.Refresh();
    }
}

3 个答案:

答案 0 :(得分:2)

(很抱歉,错过了答案功能,但是答案很长,需要发表评论)

@TaW 似乎您不太了解这种方法,所以我将尝试更详细地解释它

OP询问他是否可以在另一个控件(进度条)上制作透明的图像

我假设此透明图像位于PictureBox内,您似乎还假定了其他控件

要放置控件,如果我的假设是正确的图片框,那么他所要做的就是右键单击进度条,然后单击图片框上的“ Bring to Front”。

,在进度条前面有一个“透明” PictureBox-但是,正如您在回答中提到的那样,由于“透明”不是我期望的那样,我们无法停在那里,但显然您知道-它的“父背景色”选择”,WinForms会这样做,我们最终在ProgressBar的前面看到了一个不完全透明的图像,而是一个带有灰色背景的图像

现在,已发布的网址到位了: http://www.richardhyland.com/diary/2009/05/26/how-to-truely-make-a-picturebox-background-transparent/

这是提供的代码,并在该url中进行了解释:

public static System.Drawing.Drawing2D.GraphicsPath Transparent(Image im)
{
    int x;
    int y;
    Bitmap bmp = new Bitmap(im);
    System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
    Color mask = bmp.GetPixel(0, 0);

    for (x = 0; x <= bmp.Width - 1; x++)
    {
        for (y = 0; y <= bmp.Height - 1; y++)
        {
            if (!bmp.GetPixel(x, y).Equals(mask))
            {
                gp.AddRectangle(new Rectangle(x, y, 1, 1));
            }
        }
    }
    bmp.Dispose();
    return gp;
}

以此,我们可以在进度栏的前面实现完全透明的图片框。

因此,如果没有此代码,我们将拥有:

但使用该代码:

注意,这种方法有一些缺点:

  1. 效果不佳-您会在图像边缘看到灰色像素
  2. 在大图像上的效果不佳-因为使用GetPixel获得每个像素都是“挑战”

(请忽略图像显示“ JPG”的事实,而我所说的是透明图像-这只是Google搜索向我展示的第一张图像,是的,文件是透明png)

答案 1 :(得分:2)

您可以使用带有PictureBox的{​​{1}}。

在表单中添加Region。这将保留图像。根据需要将其放置为与PictureBox重叠。将ProgressBar属性设置为叠加图像。

然后在表单构造函数中设置此Image的{​​{1}}。该区域定义了控件的形状。我们将Region设置为等于图像的非透明部分。

PictureBox

Screenshot of form

大部分代码来自here

答案 2 :(得分:0)

5 6 个选项:

  1. 您可以将ProgressBar's BackColor设置为Transparent。结果:

enter image description here

翻译:

  

无效的属性值。此控件不支持透明的背景色。

这对于子类也是如此。

  1. 您可以嵌套以图片为Panel的透明BackgroundImage。结果:

enter image description here

如您所见,尽管面板和大多数图像是透明的,进度条仍然在其自己的BackColor中用矩形作为底图;如上所示,它不能是透明的。

  1. 您可以在面板上覆盖

结果:

enter image description here

看起来相似。但是这次,背景色是面板覆盖之前的任何原始背景。这就是Winform伪造透明度的方式;此伪造的透明胶片仅适用于嵌套控件,而不适用于所有控件。

  1. 您可以在进度栏的Paint事件中绘制图像。问题:它没有一个。而且,如果您将其子类化,它将对您不起作用。

总结:所有这些尝试失败;结论很简单:ProgressBar是一个动画控件,将不支持任何混乱。

  1. 最后一个选择:编写自己的。您可以将PanelLabel子类化并编写自己的进度栏。许多想拥有自定义外观的人都做到了,您可以找到许多现成的示例。

更新::看起来您可以有第6个选项,当且仅当您不需要半透明性(例如抗锯齿等)时,该选项才有效。 。:您可以创建一个GraphicsPath来创建一个Region,这将对图像进行遮盖一些控制。因此,尽管我的示例无法正常工作,但OP的图像可能看起来还不错