【问题标题】:Vb.net - Image SearchVb.net - 图片搜索
【发布时间】:2014-08-26 11:37:27
【问题描述】:

近 2 周来,我一直在为我的申请中的一个问题而苦苦挣扎。 我希望它单击图像,如果图像随后在我的屏幕区域中找到,或者最好是图像存在于我的整个屏幕上。 从研究中我了解到,如果将其放入数组中会更好。 我希望它尽可能高效且处理成本尽可能低,因为它可以在后台运行以关闭烦人的弹出窗口。

我已经尝试了几乎所有的方法,但都没有成功。 我最接近的继任者是另一个 SOF 帖子 用户编写一个我可以这样使用的模块:

Dim p As Point = yourBitmap.Contains(bmpYouLookFor)
If p <> Nothing Then
'...
End If

Source

你真的必须搜索一个像素,然后将你的图像与屏幕上的图像进行比较,这对我来说似乎有点慢。如果像素存在,它将花费大量时间查看虚假内容。

我真的希望它看起来不像是我在过去的 1½-2 周内真的尝试过查找论坛帖子、指南、在 VS 中引用另一种语言、询问程序员朋友、谷歌和其他东西

编辑: 基本上我需要将 1 个小图像与屏幕进行比较。如果屏幕包含我的图片,我想获取小图片的位置并点击它。

【问题讨论】:

标签: vb.net image search pixel


【解决方案1】:

如果您知道屏幕上所有图像的位置,则可以检索用户单击的位置,然后查看该点是否与您知道的任何矩形(图像)相交。

myImageRectangle.Contains(myMouseClickedPoint)

【讨论】:

  • 遗憾的是我不确定还是您的意思是粗略的?
  • 图像在屏幕上的位置如何?
  • 如果需要,可以通过将弹出窗口移动到 (0,0) 来控制它们:)
  • 您是否只是想确定您的弹出窗口是否在特定屏幕内?对不起。你能帮我澄清一下你的问题吗?
  • 如果它包含某个图片,我希望它点击弹出窗口:)。
【解决方案2】:

为此我制作了一个 dll :https://mega.co.nz/#!5YFEyQ5S!bcP-S_7EyQUsKBhxGfhpX7WvdJvUYnn8UYRmZ2RxZVQ

这是一个如何使用它的示例 (如果 x 和 y 为 0,则未找到图像,函数将返回 false)

Imports BitmapDetector2.Search_Image

Declare Function apimouse_event Lib "user32.dll" Alias "mouse_event" (ByVal dwFlags As Int32, ByVal dX As Int32, ByVal dY As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As Int32) As Boolean

Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Private Const MOUSEEVENTF_RIGHTDOWN = &H8
Private Const MOUSEEVENTF_RIGHTUP = &H10

Private Function PressButton(ByRef image As Bitmap, ByRef press As Boolean, ByRef x As Integer, ByRef y As Integer)

Dim bounds As Rectangle

Dim point As New Point

Dim screenshot As System.Drawing.Bitmap

Dim graph As Graphics bounds = Screen.PrimaryScreen.Bounds screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb)

graph = Graphics.FromImage(screenshot) graph.CopyFromScreen(0, 0, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)

Dim returnString As Point = BitmapDetector2.Search_Image.search(screenshot, image, 0)

If returnString.X = 0 And returnString.Y = 0 Then
Return False
Else

If press = True Then
point.X = returnString.X + x
point.Y = returnString.Y + y
Windows.Forms.Cursor.Position = point
Call apimouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call apimouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
Else
point.X = returnString.X + x
point.Y = returnString.Y + y
Windows.Forms.Cursor.Position = point
End If

Return True
End If

End Function 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多