【问题标题】:Make a png image transparent使png图像透明
【发布时间】:2018-10-09 11:26:38
【问题描述】:

我有一个PictureBoxPanel1.Controls.Add(pb) 添加到我的Panel1,并且我试图让我的.png 图片透明。
我尝试过使用Color.TransparentSystem.Drawing.Color.Transparent,但是当我将PictureBox 添加到我的Panel 时,我无法使其透明。

而且我也无法将图片带到其他人的前面。

这是我的代码。

Private Function molduraint()

    Dim pb As New PictureBox

    pb.BringToFront()
    pb.ImageLocation = OpenFileDialog1.FileName
    pb.SizeMode = PictureBoxSizeMode.StretchImage

    Panel1.Controls.Add(pb)

    pb.Location = New Point(txtValueX.Text, txtValueY.Text)
    If txtValueX.Text = 0 Or txtValueY.Text = 0 Then
        pb.Location = New Point(300, 172)
    End If

    pb.Visible = True
    pb.Size = New Size(TrackBar1.Value, TrackBar2.Value)
    pb.Image = PictureBox1.Image

End Function

【问题讨论】:

  • 根据您的上下文,您可以直接在面板上绘制图像。这样,您只有一个容器,并且可以保持图像的透明度。
  • @Jimi Tank 让您重播,能否请您举个例子说明如何做到这一点
  • 当然。我会把东西放在一起。

标签: vb.net winforms graphics bitmap transparency


【解决方案1】:

您可能知道,WinForms 控件并非完全设计为支持真正的透明度(Forms 除外,它们实际上可以是透明的)。

另一方面,Bitmaps 支持透明度。
如果您使用支持 Alpha 通道的图像格式(如 .png 位图)创建 Bitmap 对象,则可以在保留其透明度的情况下绘制该图像。

首先要做的是创建一个对象,该对象可用于引用我们要绘制的每个Bitmap,以便我们跟踪它们。
由于您希望能够指定这些对象的位置和大小,因此这是对象必须具有的两个属性。我在这里添加了一些有用的东西。

Public Class BitmapObject
    Public Property Name As String
    Public Property Image As Bitmap
    Public Property Position As Point
    Public Property Size As Size
    Public Property Order As Integer
End Class

属性Name 将是源文件的名称,Order 将引用Bitmap 相对于容器内绘制的另一个Bitmaps 的z 顺序位置。
所有Bitmaps 都将使用Bitmap 对象的列表进行分组,因此我们可以使用列表索引或其中一个属性来召唤它们。

Public MyBitmaps As List(Of BitmapObject) = New List(Of BitmapObject)

至于绘图表面(画布),我们可以使用Form 本身、PictureBoxPanel(因为它们或多或少只是表面)。我更喜欢Panel,它很轻巧,可以承载其他控件,并且可以根据需要移动。

如果你想在一个控件上绘图,你只需要订阅它的Paint() 事件并调用控件的Invalidate() 方法来引发它。

Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
    If MyBitmaps.Count > 0 Then
        MyBitmaps.OrderBy(Function(item) item.Order).
            Select(Function(item)
                       e.Graphics.DrawImage(item.Image, New Rectangle(item.Position, item.Size))
                       Return item
                   End Function).ToList()
    End If
End Sub

要将Bitmap 添加到List(Of BitmapObject),由于您想使用OpenFileDialog 让用户选择Bitmap,我们将此功能分配给Button,并且当Bitmap 是选中后,将创建一个新的 BitmapObject 并将其附加到列表中。

Private Sub btnOpenFile_Click(sender As Object, e As EventArgs) Handles btnOpenFile.Click

    Dim fd As OpenFileDialog = New OpenFileDialog()
    fd.InitialDirectory = "[Images Path]"
    Dim dr As DialogResult = fd.ShowDialog()

    If dr = Windows.Forms.DialogResult.OK Then
        Dim BitmapName As String = New FileInfo(fd.FileName).Name

        Using tmpBitmap As Bitmap = New Bitmap(fd.FileName)
            MyBitmaps.Add(New BitmapObject With {
                          .Image = New Bitmap(tmpBitmap),
                          .Position = New Point(Integer.Parse(TextBox1.Text), Integer.Parse(TextBox2.Text)),
                          .Size = New Size(tmpBitmap.Height, tmpBitmap.Width),
                          .Order = MyBitmaps.Count,
                          .Name = BitmapName})

            ComboBox1.Items.Add(BitmapName)
            ComboBox1.SelectedIndex = MyBitmaps.Count - 1
            TrackBar1.Value = tmpBitmap.Height
            TrackBar2.Value = tmpBitmap.Width
            Panel1.Invalidate()
        End Using
    End If
End Sub

这是结果:(Full source code in PasteBin)


【讨论】:

  • 感谢您的大力帮助事实上我在这段代码中有一些错误第一个是 PaintForm 类型由同一文件中的几个部分类组成。
  • 第二个是错误 1 ​​'Protected Overrides Sub Dispose(disposing As Boolean)' 有多个具有相同签名的定义。 C:\Users\Utilizador\Desktop\memebuilder2_1 Code\gLabel\PaintForm.Designer.vb 7 29
  • 3 是错误 2 'Private Sub InitializeComponent()' 有多个具有相同签名的定义。 C:\Users\Utilizador\Desktop\memebuilder2_1 Code\gLabel\PaintForm.Designer.vb 24 17
  • 4 是错误 3 'OrderBy' 不是 'System.Collections.Generic.List(Of gLabel.PaintForm.BitmapObject)' 的成员。 C:\Users\Utilizador\Desktop\memebuilder2_1 代码\gLabel\PaintForm.vb 42 13
  • 真正的坦克你为了伟大的帮助,我已经像你说的那样做了,它的作品很完美,好吧,我觉得它超出了主题,但可以对文本部分做同样的事情吗?
猜你喜欢
  • 2021-10-13
  • 2011-05-31
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2013-03-17
  • 2015-09-09
  • 2013-03-26
相关资源
最近更新 更多