VB.Net - Lockbits - Функции больше / меньше чем

Следующий код хорошо работает для того, что я делаю. Однако это занимает больше времени, чем мне нужно. Проблема в том, что он перебирает каждую функцию больше/меньше, а это требует времени. Я провел некоторые исследования, но не могу понять, как уменьшить все это, чтобы оно работало быстрее.

Значения пикселей RGB должны пройти следующие тесты: (1) Если одно значение больше 250, другие должны быть меньше 5 (2) Если одно значение меньше 5, другие должны быть больше 250. (3) Если одно значение равно нулю, другие должны быть больше 0 (4) Разница между любыми двумя значениями должна быть меньше 15 (или любого другого порога, который я установил) (5) Посмотрите, равны ли два значения нулю

Кроме того, поможет ли выполнение «Exit For» после каждой из этих функций?

    ' Create new bitmap from filepath in TextBox1
    Dim bmp As New Bitmap(TextBox1.Text)

    ' Lock the bitmap's pixels
    Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
    Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect, _
            Drawing.Imaging.ImageLockMode.ReadWrite, _
            Imaging.PixelFormat.Format24bppRgb)

    ' Get the address of the first line
    Dim ptr As IntPtr = bmpData.Scan0

    ' Declare an array to hold the bytes of the bitmap
    Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
    Dim rgbValues(bytes - 1) As Byte
    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)

    ' Retrieve RGB values
    Dim RedValue As Int32
    Dim GreenValue As Int32
    Dim BlueValue As Int32
    Dim l As Integer = 0                   
    For x = 0 To bmp.Width  
        For y = 0 To bmp.Height - 1
            l = ((bmp.Width * 3 * y) + (x * 3))
            RedValue = rgbValues(l)
            GreenValue = rgbValues(l + 1)
            BlueValue = rgbValues(l + 2)

            If RedValue < 5 AndAlso GreenValue < 5 AndAlso BlueValue > 250 Then
            ElseIf RedValue < 5 AndAlso GreenValue > 250 AndAlso BlueValue < 5 Then
            ElseIf RedValue > 250 AndAlso GreenValue < 5 AndAlso BlueValue < 5 Then
            ElseIf RedValue > 250 AndAlso GreenValue > 250 AndAlso BlueValue < 5 Then
            ElseIf RedValue > 250 AndAlso GreenValue < 5 AndAlso BlueValue > 250 Then
            ElseIf RedValue < 5 AndAlso GreenValue > 250 AndAlso BlueValue > 250 Then
            ElseIf RedValue > 0 AndAlso GreenValue > 0 AndAlso BlueValue.Equals(0) Then
            ElseIf RedValue > 0 AndAlso GreenValue.Equals(0) AndAlso BlueValue > 0 Then
            ElseIf RedValue.Equals(0) AndAlso GreenValue > 0 AndAlso BlueValue > 0 Then
            ElseIf (RedValue - GreenValue) < 15 AndAlso (RedValue - BlueValue) < 15 AndAlso _
                (GreenValue - RedValue) < 15 AndAlso (GreenValue - BlueValue) < 15 AndAlso _
                (BlueValue - RedValue) < 15 AndAlso (BlueValue - GreenValue) < 15 Then
            ElseIf RedValue.Equals(GreenValue) Then
            ElseIf RedValue.Equals(BlueValue) Then
            ElseIf GreenValue.Equals(BlueValue) Then
            ElseIf RedValue.Equals(BlueValue) AndAlso RedValue.Equals(GreenValue) _
                AndAlso BlueValue.Equals(GreenValue) Then
            Else
                MsgBox("Image is color.")
                Exit Sub
            End If
        Next
    Next
    MsgBox("Image is grayscale.")

    ' Unlock the bitmap
    bmp.UnlockBits(bmpData)

person Jerry Horak    schedule 10.07.2012    source источник
comment
Меня смущает ваша логика. Если (1) истинно, то (2) никогда не может быть истинным. И если (1) или (2) верны, то (4) никогда не может быть истинным. Является ли это последовательностью проверок или каждое значение RGB должно соответствовать всем правилам? Если это последовательность, то вложенные операторы If могут дать вам немного лучшую производительность.   -  person APrough    schedule 10.07.2012
comment
Это последовательность проверок, поэтому каждый тест является эксклюзивным. Я не ожидаю, что каждое значение RGB будет соответствовать каждому тесту. Я просто хочу убедиться, что я отсеял каждый пиксель, который я бы не считал цветным, в том числе отсеял крайние различия для точности (255:255:0, 0:0:255 и т. д.). Я попытаюсь вложить пару If и посмотреть, поможет ли это. Не думал об этом. Спасибо.   -  person    schedule 11.07.2012
comment
@Jerry Эти две учетные записи связаны? (Джерри Хорак и вы). Если да, сообщите нам, чтобы мы могли объединить ваши учетные записи.   -  person George Stocker    schedule 11.07.2012


Ответы (1)


Цвета в оттенках серого всегда имеют эту спецификацию ( R=G=B ). например. #cccccc = [R:204 G:204 B:204]

If Not R = G And G = B Then
 MsgBox("colored")
 Exit Sub
End If
person Pouria Amid    schedule 19.07.2012