Основная проблема с вашим текущим кодом состоит в том, что целевое изображение (изображение, содержащее срез оригинала), создается один раз, но многократно окрашивается.
Поскольку исходное изображение имеет прозрачные пиксели, результат рисования будет накоплено .
Вы можете видеть прозрачные участки, перекрывающиеся.
Это может быть легко исправлено, создавая новое Растровое изображение для каждого среза оригинала.Вы также можете перекрасить то же изображение прозрачным цветом, но это быстрее.
В коде я собираю все элементы управления PictureBox, которые получат срезы в одном массиве, поэтому вы можете назначить изображение в том же цикле, который создает растровые изображения.
Вы вызвали первый PictureBox u1
, поэтому я придерживаюсь того же соглашения об именах.
Битовые карты также необходимо утилизировать во время их создания, сохраняя копию в контейнере unitsimagearray
(если он вам действительно нужен).
Вы избавитесь от этихРастровое изображение, когда они вам больше не нужны или приложение закрывается.
Исходное растровое изображение (.GIF
) :
![Bitmap Grid](https://i.stack.imgur.com/Mq49w.gif)
Нарезанные изображения (2x).Сохраняются сглаживание и прозрачность:
![Sliced Image](https://i.stack.imgur.com/X3TYf.png)
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