Разделить изображение на разные PictureBox - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть изображение размером 187x16, которое содержит 10 меньших изображений подряд.

Я хочу разделить эти изображения на 10 различных PictureBox.
Исходное изображение:

example image

Dim fr_bm As New Bitmap(Image.FromFile(AppDomain.CurrentDomain.BaseDirectory & "/images/u/image.gif"))
Dim to_bm As New Bitmap(16, 16)
Dim unitsimagearray(9) As Image
Dim gr As Graphics = Graphics.FromImage(to_bm)
For i As Integer = 0 To 9
    Dim fr_rect As New Rectangle(i * 19, 0, 16, 16) '0,19,38,76
    Dim to_rect As New Rectangle(0, 0, 16, 16)
    gr.DrawImage(fr_bm, to_rect, fr_rect, GraphicsUnit.Pixel)
    unitsimagearray(i) = to_bm
Next
u1.Image = unitsimagearray(0)

Но PictureBox показывает все разделенные изображения.

1 Ответ

0 голосов
/ 24 февраля 2019

Основная проблема с вашим текущим кодом состоит в том, что целевое изображение (изображение, содержащее срез оригинала), создается один раз, но многократно окрашивается.
Поскольку исходное изображение имеет прозрачные пиксели, результат рисования будет накоплено .
Вы можете видеть прозрачные участки, перекрывающиеся.

Это может быть легко исправлено, создавая новое Растровое изображение для каждого среза оригинала.Вы также можете перекрасить то же изображение прозрачным цветом, но это быстрее.

В коде я собираю все элементы управления PictureBox, которые получат срезы в одном массиве, поэтому вы можете назначить изображение в том же цикле, который создает растровые изображения.
Вы вызвали первый PictureBox u1, поэтому я придерживаюсь того же соглашения об именах.

Битовые карты также необходимо утилизировать во время их создания, сохраняя копию в контейнере unitsimagearray (если он вам действительно нужен).
Вы избавитесь от этихРастровое изображение, когда они вам больше не нужны или приложение закрывается.


Исходное растровое изображение (.GIF) :

Bitmap Grid

Нарезанные изображения (2x).Сохраняются сглаживание и прозрачность:

Sliced Image

Private unitsimagearray(9) As Bitmap

Dim imagePath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "/images/u/image.gif")
Dim picBoxes() As PictureBox = {u1, u2, u3, u4, u5, u6, u7, u8, u9, u10}

Using sourceBitmap As Bitmap = DirectCast(Image.FromFile(imagePath).Clone(), Bitmap)
    For i As Integer = 0 To picBoxes.Length - 1
        Using sliceBitmap As Bitmap = New Bitmap(16, 16, PixelFormat.Format32bppArgb)
            Using g As Graphics = Graphics.FromImage(sliceBitmap)
                Dim sourceRect As New Rectangle(i * 19, 0, 16, 16)
                Dim destinationRect As New Rectangle(0, 0, 16, 16)
                g.DrawImage(sourceBitmap, destinationRect, sourceRect, GraphicsUnit.Pixel)
                unitsimagearray(i) = DirectCast(sliceBitmap.Clone(), Bitmap)
                picBoxes(i).Image = unitsimagearray(i)
            End Using
        End Using
    Next
End Using
...