Сделать изображение в формате png прозрачным - PullRequest
0 голосов
/ 29 апреля 2018

У меня PictureBox добавлено к Panel1 с Panel1.Controls.Add(pb), и я попытался сделать мою .png картинку прозрачной.
Я пытался с Color.Transparent и System.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 голосов
/ 29 апреля 2018

Как вы, наверное, знаете, WinForms элементы управления не совсем предназначены для поддержки истинной прозрачности (за исключением Forms, они могут быть фактически прозрачными).

Bitmaps, с другой стороны, поддерживает прозрачность.
Если вы создаете объект 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 будет ссылаться на позицию z-порядка Bitmap относительно других Bitmaps, нарисованных внутри контейнера.
Все Bitmaps будут сгруппированы с использованием Списка Bitmap объектов, поэтому мы можем вызвать их с помощью Списка Индекса или одного из свойств.

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

Что касается поверхности рисования (холста), мы можем использовать Form, PictureBox или Panel (потому что они - более или менее - просто поверхности). Я предпочитаю 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

Это результат: ( Полный исходный код в PasteBin )

enter image description here

...