Code:
Public NotInheritable Class ImageScanner
Public Shared Function FindBitmap(ByVal Haystack As Bitmap, ByVal Needle As Bitmap, Optional ByVal ShowDebug As Boolean = False) As Rectangle()
Dim HaystackStride As Integer = 0
Dim HaystackBPP As Integer = 0
Dim HaystackData As String = BitmapToString(Haystack, New Rectangle(0, 0, Haystack.Width, Haystack.Height), HaystackStride, HaystackBPP)
Dim NeedleStride As Integer = 0
Dim NeedleBPP As Integer = 0
Dim NeedleData As String = BitmapToString(Needle, New Rectangle(0, 0, Needle.Width, Needle.Height), NeedleStride, NeedleBPP)
Dim ReturnList As New List(Of Rectangle)
For Y As Integer = 0 To Haystack.Height - Needle.Height
For X As Integer = 0 To Haystack.Width - Needle.Width
If GetPixelFromString(HaystackData, New Point(X, Y), HaystackStride, HaystackBPP).ToArgb <> _
GetPixelFromString(NeedleData, New Point(0, 0), NeedleStride, NeedleBPP).ToArgb Then Continue For
If ShowDebug Then Debug.WriteLine(New Point(X, Y).ToString)
Dim ChildCompare As Image = Haystack.Clone(New Rectangle(X, Y, Needle.Width, Needle.Height), Imaging.PixelFormat.Format24bppRgb)
If BitmapToString(ChildCompare, New Rectangle(0, 0, Needle.Width, Needle.Height), 0, 0) = NeedleData Then
ReturnList.Add(New Rectangle(X, Y, Needle.Width, Needle.Height))
End If
ChildCompare.Dispose()
Next
Next
Return ReturnList.ToArray
End Function
Private Shared Function GetPixelFromString(ByVal S As String, ByVal P As Point, _
ByVal Stride As Long, ByVal BPP As Integer) As Color
Dim StartPos As Long = (Stride * P.Y) + (BPP * P.X)
Dim BChar As Char = S(StartPos + 0)
Dim GChar As Char = S(StartPos + 1)
Dim RChar As Char = S(StartPos + 2)
Return Color.FromArgb(Asc(RChar), Asc(GChar), Asc(BChar))
End Function
Private Shared Function BitmapToString(ByVal Image As Bitmap, ByVal Bounds As Rectangle, ByRef Stride As Integer, ByRef BPP As Integer) As String
Dim BitmapData As Imaging.BitmapData = Image.LockBits(Bounds, Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format24bppRgb)
BPP = (BitmapData.Stride - 1) / BitmapData.Width
Stride = BitmapData.Stride
Dim ImageData As String = Runtime.InteropServices.Marshal.PtrToStringAnsi(Bi tmapData.Scan0, BitmapData.Stride * BitmapData.Height)
Image.UnlockBits(BitmapData)
Return ImageData
End Function
Source: