使png图像透明

问题描述 投票:1回答:1

我有一个PictureBox添加到我的Panel1Panel1.Controls.Add(pb),我试图让我的.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
vb.net winforms bitmap transparency
1个回答
2
投票

正如您可能知道的那样,WinForms控件并非完全旨在支持真正的透明度(除了Forms,它们实际上可以是透明的)。

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

首先要做的是创建一个可以用来引用我们想要绘制的每个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对象列表进行分组,因此我们可以使用List Index或其中一个属性来召唤它们。

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并附加到List。

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.