2012-08-27 70 views
1

我正在使用Pixel在大圖像和小圖像之間進行搜索。我有一個成功的工作,但無法讓lockbits版本做我想做的事情。2個圖像之間的圖像識別vb.net Lockbits

拳頭我想循環瀏覽大圖像,找到裏面較小圖像的第一個像素。然後,一旦找到第一個像素來做數學方程來告訴我它達到了多少精確度。如果符合標準,將鼠標移動到大圖像內部小圖像的第一個像素(最左邊)的屏幕上的位置。與GetPixel格式相比,它的成功率很高,速度非常快。

問題在小圖像的開始像素所在的大圖像上無法獲取位置,並將鼠標移動到該位置。下面是代碼:

   Try 
     Dim ifnd As Boolean = False 
     Dim PreviousX As Integer 
     Dim PreviousY As Integer 
     PreviousX = MousePosition.X 
     PreviousY = MousePosition.Y 
     Dim MatchCount As Integer = 0 



     Dim oX As Integer = 0 
     Dim oi As Integer = 0 
     Dim iX As Integer = 0 
     Dim iY As Integer = 0 
     Dim bmp_original As Bitmap 
     Dim ImG As Bitmap 
     ImG = PictureBox2.BackgroundImage 
     bmp_original = ImG 
     Dim bmp_large As Bitmap 
     Dim SmG As Image 
     SmG = PictureBox1.BackgroundImage 
     bmp_large = SmG 
     Dim bmg As Bitmap 
     'large image 
     ImG = BBt 
     'small image 
     bmg = Abt 
     Thread.Sleep(1000) 
     'large image 
     If BBt Is Nothing Then 
      Dim xbit As Bitmap = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height) 

      Dim g As Graphics = Graphics.FromImage(xbit) 
      BBt = xbit 
      g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size) 
      g.Dispose() 
      Thread.Sleep(2000) 
     End If 

     'small image 
     PictureBox5.BackgroundImage = Abt 
     'large image 
     PictureBox6.BackgroundImage = BBt 
     'For value As Integer = 0 To 5 
     'For value As Integer = 10 To 0 Step -2 
     Thread.Sleep(1000) 
     'original image 
     Dim oRect As New Rectangle(0, 0, bmg.Width, bmg.Height) 
     Dim oBmpData As BitmapData = bmg.LockBits(oRect, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb) 
     Dim oPtr As IntPtr = oBmpData.Scan0 
     Dim oPixels(99) As Integer 
     Dim oMaxPix As Integer = bmg.Width + bmg.Height 
     Marshal.Copy(oPtr, oPixels, 0, oMaxPix) 
     Dim smWidth As Integer 
     smWidth = bmg.Width - 1 
     'small image 
     PictureBox3.BackgroundImage = bmg 
     'large image 
     Dim lRect As Rectangle = New Rectangle(0, 0, bmp_large.Width, bmp_large.Height) 
     Dim lBmpData As BitmapData = ImG.LockBits(lRect, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb) 
     Dim lPtr As IntPtr = lBmpData.Scan0 
     Dim PixelCount As Integer = ImG.Width * ImG.Height 
     Dim lPixels(PixelCount - 1) As Integer 
     Marshal.Copy(lPtr, lPixels, 0, PixelCount) 
     'large image 
     PictureBox4.BackgroundImage = ImG 

     Dim MathScore As Integer 
     Dim MaxScore As Integer = bmg.Height 

     'beginning of Marshal Loop 
     For i As Integer = 0 To lPixels.GetUpperBound(0) 

      If oPixels(0) = lPixels(i) Then 
       'we have a match for top left pixel - so compare the other pixels 
       Dim PixelsToLeft As Integer = (i Mod ImG.Width) - 1 'pixels to left of 10by10 section of large image 
       Dim PixelsToRight As Integer = ImG.Width - PixelsToLeft - smWidth 'pixels to right of 10by10 section of large image 
       Dim d As Integer = PixelsToLeft + PixelsToRight 'array distance between right edge of 10by10 section and left edge of next row 

       For y As Integer = 0 To 9 
        For x As Integer = 0 To 9 
         Dim oIndex As Integer = (y * 10) + x 
         Dim lIndex As Integer = (i + (y * (d + smWidth))) + x 
         If oPixels(oIndex) = lPixels(lIndex) Then 
          MathScore = MathScore + 1 
          xx = oPixels(0) + 2 
          yy = lPixels(i) + 3 
          SetCursorPos(xx, yy) 
         End If 

        Next 



       Next 
       If MathScore >= Val(MaxScore/2.5) Then 
        SetCursorPos(xx, yy) 
        Dim percent As String 
        Dim myDec As Decimal 
        'inttemp = (intData2 * 100)/intData1 
        myDec = Val((MathScore * 100)/MaxScore) 
        myDec = FormatNumber(myDec, 0) 
        percent = myDec & "%" 
        Label16.Text = "Match Score: " & percent 
        Label17.Text = "Math Score: " & MathScore & " out of " & MaxScore 
        Me.ToolStripStatusLabel2.Text = "Completed" 
        Me.Button4.Enabled = True 
        GoTo Foundit 
       End If 
      End If 
     Next 
     PictureBox1.Image = (Abt) 
     PictureBox2.Image = (BBt) 
     ImG.UnlockBits(oBmpData) 
     bmg.UnlockBits(lBmpData) 

Foundit: mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0) mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0) 捕捉 結束Try

現在如果我能弄清楚如何讓鼠標在屏幕上移動,那麼我會想出來。不幸的是,我一直在這方面做了幾天沒有任何成功。如果你能幫助,我將不勝感激。先謝謝你。

回答

0

移動鼠標做到這一點

dim a as new point 
a.x = "the number you want" 
a.y = "the number you want" 
windows.forms.cursor.position = a