2012-07-10 86 views
0

下面的代碼很適合我在做什麼。然而,這需要的時間比我需要的要長。問題在於它遍歷每個大於/小於函數,這需要時間。我做了一些研究,但無法弄清楚如何渺茫了這一切,使其運行速度更快。 (1)如果一個值大於250,其他值必須小於5 (2)如果一個值小於5,則其他值小於5,其他值不小於5必須大於250 (3)如果一個值等於零,其餘都必須大於0 (4)中的任2個值之間的差必須小於15(或任何其他閾值I設定) ( 5)看看兩個值等於零VB.Net - Lockbits - 大/小於功能

而且,會做「退出對於」每個功能後幫助嗎?

' 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) 
+0

我你的邏輯困惑。如果(1)是真的,那麼(2)永遠不會是真的。如果(1)或(2)是真的,那麼(4)永遠不會是真的。這是一系列檢查,還是每個RGB值都必須符合所有規則?如果它是一個序列,那麼嵌套If語句可能會給你表現稍好 – APrough 2012-07-10 19:18:36

+0

這是檢查的順序,以便每個測試是唯一的。我不希望每個RGB值都符合每個測試。我只是想確保清除每一個我認爲不會着色的像素,包括爲了準確性(255:255:0,0:0:255等)而清除極端的差異。我會嘗試嵌套一對夫婦,看看是否有幫助。沒想到這一點。謝謝。 – 2012-07-10 22:54:28

+0

@Jerry難道這兩個帳戶鏈接? (傑裏霍拉克和你)。如果是這樣,請告訴我們,以便我們可以合併您的帳戶。 – 2012-07-11 00:56:04

回答

0

灰度顏色具有始終本說明書(R = G = B)。 例如。 #CCCCCC = [R:204 G:204 B:204]

If Not R = G And G = B Then 
MsgBox("colored") 
Exit Sub 
End If