【问题标题】:I do not know why my nested for next loop is only going through one loop我不知道为什么我的嵌套 for next 循环只经过一个循环
【发布时间】:2018-12-12 09:54:42
【问题描述】:

我目前正在 Visual Basic 上制作迷宫游戏,我需要检索图像中所有像素的颜色。为此,我制作了一个嵌套的 for next 循环——宽度为 1,高度为 1,因为代码遍历两个循环,它将获取每个像素的像素颜色并将其放置在二维数组中。

问题是它只遍历长度而不是宽度

这是我的代码:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim widthIMG As Integer
    Dim lengthIMG As Integer
    Dim pixels(438, 343) As Color
    Dim pixelsData(438, 343) As String
    Dim myBitmap As New Drawing.Bitmap(PictureBox1.Image)


    For widthIMG = 1 To myBitmap.Width
        For lengthIMG = 1 To myBitmap.Height

            pixels(widthIMG, lengthIMG) = myBitmap.GetPixel(widthIMG, lengthIMG)

            Select Case pixels(widthIMG, lengthIMG).ToString
                Case "Color [A=255, R=0, G=0, B=0]"
                    TextBox1.Text = TextBox1.Text & "Width: " & widthIMG & "Length: " & lengthIMG & "Color: " & "Black " & vbCrLf
                    pixelsData(widthIMG, lengthIMG) = "Black"
                Case "Color [A=255, R=255, G=255, B=255]"

                    TextBox1.Text = TextBox1.Text & "Width: " & widthIMG & "Length: " & lengthIMG & "Color: " & "White" & vbCrLf
                    pixelsData(widthIMG, lengthIMG) = "White"

            End Select
        Next
    Next
End Sub

【问题讨论】:

  • 你能发布一个你从上面的代码中得到的示例输出
  • @preciousbetine ibb.co/0scBVqb 所以它会遍历每个像素。你可以看到最终的长度值为 342,这是实际图像的高度(这意味着长度工作正常)但宽度没有改变,它只是保持在 1。
  • 您似乎拥有超过 150,000 个数据点。也许您的文本框空间不足
  • 我想补充一点信息 - 使用控件作为主要数据源通常被认为是个坏主意。您最好将信息存储在数组或列表中,并使用它来填充您的用户界面。我还建议数组或列表应该存储布尔值而不是字符串 - 它可能更快并且使用更少的内存。使用TrueFalse 来表示黑色或白色。在您的情况下,可能黑色为True,因为它代表一堵墙,白色为False,因为它代表什么

标签: vb.net image maze


【解决方案1】:

你已经越界了。 使用此修改重试:

For widthIMG = 0 To myBitmap.Width - 1
    For lengthIMG = 0 To myBitmap.Height - 1

这背后的原因是数组从零开始。 当你这样做时:

For index As Integer = 1 To 5
    Debug.Write(index.ToString & ", ")
Next

您的输出将是 1、2、3、4、5。

但是您的图像数组从零开始,并以比显示大小小一个整数结束。所以一个数组,比如说 342,实际上是 0 到 341。

【讨论】:

  • 当我用您的修改替换它时,它不会加载。
  • 好的,当我从数组中减去 1 时加载它 Dim pixel(437, 342) As Color Dim pixelData(437, 342) As String 但是它仍然只打印 1 个宽度
  • 抱歉耽搁了,今晚我会好好看看这个。随意添加任何其他可能有帮助的信息。
  • 你能把图片发给我吗?我会尝试重现错误。
  • 好的,我已经解决了这个问题,完全避免了 for next 查看,而是使用了 do until 循环。 paste.ee/p/v9djm
【解决方案2】:

您的问题可能是因为有一个异常退出您的程序。图片坐标从0开始。现在,当lengthIMG等于myBitmap.Height时,会报错。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim x As Integer
    Dim y As Integer
    Dim pixels(438, 343) As Color
    Dim pixelsData(438, 343) As String
    Dim myBitmap As New Drawing.Bitmap(PictureBox1.Image)


    For x = 0 To myBitmap.Width - 1
        For y = 0 To myBitmap.Height - 1

            pixels(x, y) = myBitmap.GetPixel(x, y)

            Select Case pixels(x, y).ToString
                Case "Color [A=255, R=0, G=0, B=0]"
                    TextBox1.Text = TextBox1.Text & "X: " & x & " Y: " & y & " Color: " & "Black " & vbCrLf
                    pixelsData(x, y) = "Black"
                Case "Color [A=255, R=255, G=255, B=255]"

                    TextBox1.Text = TextBox1.Text & "X: " & x & " Y: " & y & " Color: " & "White" & vbCrLf
                    pixelsData(x, y) = "White"

            End Select
        Next
    Next
End Sub

这假设您的图像不大于 438、343,因为您的数组是固定的。

另外,请使用x,y作为坐标,这是标准的:)

最后一个提示,我会将您的逻辑分成更小的方法。一种加载位图并返回像素数据的方法。一种采用像素数据并返回文本框字符串的方法。这样,您可以轻松地输出到文件而不是文本框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 2018-06-05
    • 2023-03-24
    • 2017-09-20
    • 2019-08-20
    • 2018-10-11
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多