使png图像透明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使png图像透明相关的知识,希望对你有一定的参考价值。

我有一个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
答案

正如您可能知道的那样,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

以上是关于使png图像透明的主要内容,如果未能解决你的问题,请参考以下文章

在片段中使用 CoordinatorLayout 时如何使状态栏透明

如何使背景PNG图像Alpha通道在QMainWindow中显示为透明

如何使html中的图像透明?

如何在 BufferedImage 中使颜色透明并另存为 PNG

如何使PNG中的悬停在透明度上不计为悬停?

perl imagemagick中的png水印,使png透明