【问题标题】:Split an Image into different PictureBoxes将图像拆分为不同的图片框
【发布时间】:2019-07-17 13:01:42
【问题描述】:

我有一个大小为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 显示所有分割的图像。

【问题讨论】:

  • 没关系,但您的问题是什么?什么不起作用。示例代码
  • 那么,每个子图的宽度(网格的实际大小)是多少?你有没有试过把它们分开?
  • @nbk 问题很清楚,我想分割我的图像但我不知道如何!
  • @Jimi 17x16 ,我用谷歌搜索了它,但我没有找到正确的答案
  • 看起来像17 * 10 <> 187。你有备用像素吗?在哪里?

标签: vb.net winforms graphics picturebox


【解决方案1】:

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

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

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

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


原始位图 (.GIF)

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

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

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 2020-03-03
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多