Я не знаю, почему мой следующий цикл проходит только один цикл - PullRequest
0 голосов
/ 12 декабря 2018

В настоящее время я делаю игру-лабиринт на Visual Basic, и мне нужно получить цвета для всех пикселей изображения.Чтобы сделать это, я создал вложенный цикл для следующего цикла - 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

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Ваша проблема здесь, вероятно, из-за исключения, которое завершает вашу программу.Координата изображения начинается с 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, то есть стандарт:)

Последний совет, я бы разделил вашу логику на меньший метод.Один из способов загрузить растровое изображение и вернуть pixData.Один метод, который принимает pixData и возвращает строку для текстового поля.Таким образом, вы можете легко выводить в файл вместо текстового поля.

0 голосов
/ 12 декабря 2018

Вы вышли за пределы.Попробуйте еще раз с этой модификацией:

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.

...