将一个图像分割成不同的 PictureBoxes
Split an Image into different PictureBoxes
我有一个大小为 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)。保留抗锯齿和透明度:
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 idx As Integer = 0 To picBoxes.Length - 1
Dim slice As Bitmap = New Bitmap(16, 16, PixelFormat.Format32bppArgb)
Using g As Graphics = Graphics.FromImage(slice)
Dim sourceRect As New Rectangle(idx * 19, 0, 16, 16)
Dim destinationRect As New Rectangle(0, 0, 16, 16)
g.DrawImage(sourceBitmap, destinationRect, sourceRect, GraphicsUnit.Pixel)
unitsimagearray(idx) = slice
picBoxes(idx).Image = unitsimagearray(idx)
End Using
Next
End Using
我有一个大小为 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)。保留抗锯齿和透明度:
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 idx As Integer = 0 To picBoxes.Length - 1
Dim slice As Bitmap = New Bitmap(16, 16, PixelFormat.Format32bppArgb)
Using g As Graphics = Graphics.FromImage(slice)
Dim sourceRect As New Rectangle(idx * 19, 0, 16, 16)
Dim destinationRect As New Rectangle(0, 0, 16, 16)
g.DrawImage(sourceBitmap, destinationRect, sourceRect, GraphicsUnit.Pixel)
unitsimagearray(idx) = slice
picBoxes(idx).Image = unitsimagearray(idx)
End Using
Next
End Using