Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将图像拆分为不同的图片框_Vb.net_Winforms_Graphics_Picturebox - Fatal编程技术网

Vb.net 将图像拆分为不同的图片框

Vb.net 将图像拆分为不同的图片框,vb.net,winforms,graphics,picturebox,Vb.net,Winforms,Graphics,Picturebox,我有一个大小为187x16的图像,其中一行包含10个较小的图像 我想将这些图像分成10个不同的图片框。 原始图像: 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 =

我有一个大小为187x16的图像,其中一行包含10个较小的图像

我想将这些图像分成10个不同的图片框。
原始图像:

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显示了所有分割的图像

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

它可以很容易地纠正,为原始图像的每个切片创建一个新位图。您也可以使用透明颜色重新绘制相同的图像,但这会更快

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

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


原始位图(
.GIF

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


没关系,但你的问题是什么?什么不起作用。SamplecodeSo,哪个是每个子图像的宽度(网格的实际大小)?你试过分裂他们吗?@nbk问题很清楚,我想分裂我的形象,但我不知道如何分裂@Jimi 17x16,我在谷歌上搜索了一下,但没有找到正确的答案看起来像
17*10187
。你有多余的像素吗?哪里
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 = Image.FromStream(New MemoryStream(File.ReadAllBytes(imagePath)))
    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