使png图像透明

时间:2018-04-29 00:42:34

标签: vb.net winforms bitmap transparency

PictureBox添加了Panel1 Panel1.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

1 个答案:

答案 0 :(得分: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个对象列表进行分组,因此我们可以使用列表索引或其中一个属性来召唤它们。

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 1}},当选择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

enter image description here