将图像拆分为不同的PictureBox

时间:2019-02-23 17:03:24

标签: vb.net winforms graphics picturebox

我有一个尺寸为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 :(得分:1)

当前代码的主要问题是目标图像(包含原始图像的 slice 的图像)创建一次,但绘制了许多次。
由于原始图像具有透明像素,因此绘画结果将被累积
您可以看到透明部分重叠。

可以轻松地对其进行纠正,从而为原始文件的每个切片创建一个新的位图。您也可以用透明颜色重新绘制相同的图像,但这更快。

在代码中,我正在组装将在一个数组中接收切片的所有PictureBox控件,因此您可以在创建位图的同一循环中分配Image。
您调用了第一个PictureBox u1 ,所以我遵循相同的命名约定。

位图在创建时也需要进行处理,将副本保存在 unitsimagearray 容器中(如果您确实需要)。
当您不再需要这些位图或应用程序关闭时,将对其进行处置。


原始位图(.GIF

Bitmap Grid

切片图像(2倍)。保留抗锯齿和透明度:

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