【问题标题】:VB.NET Winforms: Overlay two transparent imagesVB.NET Winforms:叠加两个透明图像
【发布时间】:2013-11-24 19:56:57
【问题描述】:

我试图在一个 winform 中叠加两个透明图像,但它一直在顶部透明图像后面渲染表单的背景图像,而不是第二个图像...

我的基本设置是我有两个面板,每个面板中都有一个图片框。图片框中的每个图像都有一些透明区域。我已将面板的 BackColor 设置为 color.transparent。

当我让一个面板覆盖另一个面板时,我看到表单的背景色穿过而不是底层图像。

我是否缺少可以设置的属性?

【问题讨论】:

  • 尝试不使用面板。简单地将一个面板堆叠在另一个面板上可能不起作用,因为 Panel2 的父级仍然是表单(因此,它背后的东西),而不是底部面板。
  • 最简单的方法就是使用one PictureBox。分配 BackgroundImage 和 Image 或使用其 Paint 事件通过 e.Graphics.DrawImage() 绘制第二个图像
  • 在仍然使用 PicturBox 时,最接近的方法是修改其 Region() 属性,使其不再是矩形。

标签: vb.net winforms image


【解决方案1】:

您只需要一个图片框。覆盖可以用图形来完成。

Imports System.Drawing

Dim OverlayImage As New Bitmap("Some Path", True)
Dim BackImage As New Bitmap("Some Path", True)
g As Graphics = Graphics.FromImage(BackImage)

g.DrawImage(OverlayImage, 0, 0)
pictureBox1.Image = BackImage


如果你想让计时器移动覆盖的图像,那么首先,创建一个变量
Dim posX As Integer = 0
然后使用
g.DrawImage(OverlayImage, posX, 0)
现在,当你的计时器计时,将 posX 增加 10

【讨论】:

  • 我以当前方式设置它的原因有一些逻辑:面板内图片框的位置发生了变化。我基本上在那里有一个精灵,所以我更改了面板中的图片框位置以显示给定的帧。然后面板四处移动..
  • 如果我错了,请纠正我。您希望能够在程序启动后更改正在覆盖的图片的位置,这样您就不能锁定坐标。
  • 我使用了一个定时器,每一个tick将图片框位置的x值加10。
  • @Blue0500 的回答是正确的做法。 WinForms 控件不是透明的,但它们通过在绘制内容之前将表单图像复制到自身中来模拟透明度。
  • 所以你需要能够用计时器移动覆盖的图片?
【解决方案2】:

这是叠加两个图像的完整功能(改编自 Blue0500 的答案):

''' <summary> Return a new image with one superimposed over the other. </summary>
Function OverlayImgs(ByVal BackgroundImg As System.Drawing.Bitmap, ByVal OverlayImg As System.Drawing.Bitmap, Position As System.Drawing.Point) As System.Drawing.Bitmap
    Dim g = System.Drawing.Graphics.FromImage(BackgroundImg)
    g.DrawImage(OverlayImg, Position)
    Return BackgroundImg
End Function

用法:

lblTest.Image = OverlayImgs(Img1, Img2, New Point(16, 16))

【讨论】:

    【解决方案3】:

    您不需要PictureBox,除非您将它用于画布。您可以将所有图像绘制为 Rectangle 结构并四处移动它们。就我个人而言,我会创建一个具有 Rectangle、Image 和其他属性的类对象,并将它们保存在一个集合中。然后,您只需通过包括位置在内的属性来绘制类对象。如果图像包含透明胶片,它们将为您叠加。这也为您提供了一种通过Rectangle.IntersectsWith 函数检查冲突的方法。

    【讨论】:

    • 好吧,我猜我将不得不重新考虑如何运行这个应用程序......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2015-04-21
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多