Jump to content

Recommended Posts

Posted (edited)

ImageSearch UDF v3.5 - AutoIt Wrapper for ImageSearchDLL

Advanced image search library for AutoIt with cache system and SIMD optimization.

Overview

ImageSearchDLL UDF is a high-performance image search library for AutoIt that enables you to find images on screen or within other images. Built with C++14 and optimized with SIMD instructions (AVX512/AVX2/SSE2), it provides fast and accurate image matching capabilities.

Features

  • High Performance: SIMD optimization (AVX512/AVX2/SSE2) for fast searching
  • Multi-Monitor Support: Full support for multi-monitor setups with negative coordinates
  • DPI Awareness: Thread-local DPI awareness without affecting AutoIt GUI
  • Cache System: Persistent cache for 30-50% speed boost on repeated searches
  • Image Scaling: Search for images at different scales (0.1x to 5.0x)
  • Screen Capture: Direct screen capture with DPI-aware coordinates
  • Mouse Automation: Precise mouse movement and clicking with multi-monitor support

Requirements

  • AutoIt: Version 3.3.16.1 or higher
  • Windows: XP SP3 to Windows 11
  • Architecture: x86 or x64 (automatic detection)
  • DLL: ImageSearchDLL v3.5 (included)

Installation

  1. Download the UDF package

  2. Place ImageSearchDLL_UDF.au3 in your script directory

  3. Ensure the appropriate DLL is in the same directory:

    • ImageSearchDLL_x64.dll for 64-bit AutoIt
    • ImageSearchDLL_x86.dll for 32-bit AutoIt
    • Not required in embedded version! (But need to install Visual C++ Redistributable 2015-2022)
  4. Include the UDF in your script:

#include "ImageSearchDLL_UDF.au3"

Quick Start

Basic Image Search

#include "ImageSearchDLL_UDF.au3"

; Search for a button on screen
Local $aResult = _ImageSearch("button.png")
If $aResult[0] > 0 Then
    ConsoleWrite("Found at: " & $aResult[1][0] & ", " & $aResult[1][1] & @CRLF)
    MouseClick("left", $aResult[1][0], $aResult[1][1])
Else
    ConsoleWrite("Image not found" & @CRLF)
EndIf

Wait for Image and Click

; Wait up to 5 seconds for button to appear, then click it
If _ImageSearch_WaitClick(5000, "button.png") Then
    MsgBox(0, "Success", "Button clicked!")
Else
    MsgBox(0, "Failed", "Button not found within 5 seconds")
EndIf

Screen Capture

; Capture a region and save as PNG
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\screenshot.png", 100, 100, 600, 400)

; Capture full screen
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\fullscreen.png")

API Reference

Startup & Configuration

_ImageSearch_Startup()

Initializes the ImageSearch library by loading the appropriate DLL.

Returns:

  • Success: 1 (DLL loaded successfully)
  • Failure: 0 and sets @error

Remarks:

  • Must be called before using any search functions
  • Automatically called on script start
  • DLL v3.5+ uses thread-local DPI awareness and won't affect AutoIt GUI

 

_ImageSearch_Shutdown()

Closes the DLL and cleans up resources.

 

_ImageSearch_SetDllPath($sPath)

Sets a custom DLL path (must be called before _ImageSearch_Startup).

Parameters:

  • $sPath - Full path to the DLL file

Returns:

  • Success: 1
  • Failure: 0 (file not found)

 

Core Search Functions

_ImageSearch($sImagePath [, $iLeft, $iTop, $iRight, $iBottom [, $iScreen [, $iTolerance [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache]]]]]]]])

Searches for an image within a specified screen area.

Parameters:

  • $sImagePath - Image file path(s), multiple separated by "|"
  • $iLeft, $iTop, $iRight, $iBottom - Search region (0 = entire screen)
  • $iScreen - Monitor index (-1 = virtual screen, 0 = primary, 1+ = specific monitor)
  • $iTolerance - Color tolerance 0-255 (default: 10)
  • $iResults - Max results 1-1024 (default: 1)
  • $iCenterPOS - Return center (1) or top-left (0) coordinates (default: 1)
  • $fMinScale, $fMaxScale - Scale range 0.1-5.0 (default: 1.0)
  • $fScaleStep - Scale step (default: 0.1)
  • $iReturnDebug - Debug mode (default: 0)
  • $iUseCache - Enable cache (default: 1)

Returns:

  • Success: Array of found positions [count][X, Y, Width, Height]
  • Failure: Empty array with @error set

Example:

; Search for multiple images with scaling
Local $aResult = _ImageSearch("icon1.png|icon2.png", 0, 0, 800, 600, -1, 10, 5, 1, 0.8, 1.2, 0.1)
If $aResult[0] > 0 Then
    For $i = 1 To $aResult[0]
        ConsoleWrite("Match " & $i & " at: " & $aResult[$i][0] & ", " & $aResult[$i][1] & @CRLF)
    Next
EndIf

 

_ImageSearch_InImage($sSourceImage, $sTargetImage [, $iTolerance [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache]]]]]]]])

Searches for a target image within a source image (file-to-file search).

Parameters:

  • $sSourceImage - Path to source image file
  • $sTargetImage - Path to target image file(s), multiple separated by "|"
  • Other parameters same as _ImageSearch

Returns: Same as _ImageSearch

Remarks: Useful for pre-processing images or testing without screen capture

Example:

$aResult = _ImageSearch_InImage("screenshot.png", "button.png", 20)

 

_ImageSearch_hBitmap($hBitmapSource, $hBitmapTarget [, $iTolerance [, $iLeft [, $iTop [, $iRight [, $iBottom [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache]]]]]]]]]]]])

Searches for a target bitmap within a source bitmap (memory-to-memory search).

Parameters:

  • $hBitmapSource - Handle to source bitmap (HBITMAP)
  • $hBitmapTarget - Handle to target bitmap (HBITMAP)
  • Other parameters same as _ImageSearch

Returns: Same as _ImageSearch

Remarks:

  • Fastest method for repeated searches (no disk I/O)
  • Bitmaps must be created with GDI/GDI+ functions

 

Screen Capture Functions

_ImageSearch_CaptureScreen([$iLeft, $iTop, $iRight, $iBottom [, $iScreen]])

Capture screen region and return as HBITMAP handle.

Parameters:

  • $iLeft, $iTop, $iRight, $iBottom - Capture region (default: 0 = full screen)
  • $iScreen - Monitor index (default: -1 = virtual screen)

Returns:

  • Success: HBITMAP handle (must DeleteObject when done)
  • Failure: 0 and sets @error

Example:

$hBitmap = _ImageSearch_CaptureScreen(0, 0, 800, 600)
; ... use $hBitmap ...
_WinAPI_DeleteObject($hBitmap)

 

_ImageSearch_ScreenCapture_SaveImage($sImageFile [, $iLeft [, $iTop [, $iRight [, $iBottom [, $iScreen]]]]])

Captures a screen region and saves it directly to an image file in one call.

Parameters:

  • $sImageFile - Output file path (extension determines format: .bmp, .png, .jpg/.jpeg)
  • $iLeft, $iTop, $iRight, $iBottom - Capture region (default: 0 = full screen)
  • $iScreen - Monitor index (default: 0 = primary screen)

Returns:

  • Success: True (1)
  • Failure: False (0) and sets @error

Remarks:

  • Automatically detects format from file extension
  • ~2x faster than separate capture + save operations
  • JPEG quality is fixed at 100% (highest quality)
  • Uses DPI-aware capture (accurate on all DPI scales)

Example:

; Capture full primary screen to PNG
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\screenshot.png")

; Capture region on monitor 2 to JPEG
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\region.jpg", 100, 100, 600, 400, 2)

 

_ImageSearch_hBitmapLoad($sImageFile [, $iAlpha [, $iRed [, $iGreen [, $iBlue]]]])

Load image file and convert to HBITMAP handle.

Parameters:

  • $sImageFile - Path to image file
  • $iAlpha, $iRed, $iGreen, $iBlue - Background color components 0-255 (default: 0 = transparent)

Returns:

  • Success: HBITMAP handle (must DeleteObject when done)
  • Failure: 0 and sets @error

Example:

$hBitmap = _ImageSearch_hBitmapLoad("image.png", 255, 255, 255, 255) ; White background
; ... use $hBitmap ...
_WinAPI_DeleteObject($hBitmap)

 

Mouse Functions

_ImageSearch_MouseMove($iX, $iY [, $iSpeed [, $iScreen]])

Moves mouse cursor to coordinates (supports negative coordinates on multi-monitor).

Parameters:

  • $iX, $iY - Target coordinates (-1 = keep current position)
  • $iSpeed - Speed 0-100 (0=instant, default: 0)
  • $iScreen - Monitor index (default: -1 = virtual screen)

Returns: 1 on success, 0 on failure

 

_ImageSearch_MouseClick([$sButton [, $iX [, $iY [, $iClicks [, $iSpeed [, $iScreen]]]]]])

Clicks mouse at coordinates (screen or current position).

Parameters:

  • $sButton - Button: "left", "right", "middle" (default: "left")
  • $iX, $iY - Coordinates (-1 = current position)
  • $iClicks - Number of clicks (default: 1)
  • $iSpeed - Speed 0-100 (0=instant, default: 0)
  • $iScreen - Monitor index (default: -1 = virtual screen)

Returns: 1 on success, 0 on failure

 

_ImageSearch_MouseClickWin($sTitle, $sText, $iX, $iY [, $sButton [, $iClicks [, $iSpeed]]])

Clicks mouse in a window.

Parameters:

  • $sTitle - Window title/class/handle
  • $sText - Window text
  • $iX, $iY - Relative coordinates in window
  • $sButton - Button (default: "left")
  • $iClicks - Number of clicks (default: 1)
  • $iSpeed - Speed 0-100 (default: 0)

Returns: 1 on success, 0 on failure

 

Wait & Click Functions

_ImageSearch_Wait($iTimeout, $sImagePath [, $iLeft [, $iTop [, $iRight [, $iBottom [, $iScreen [, $iTolerance [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache [, $iMaxAttempts]]]]]]]]]]]]])

Waits for an image to appear on screen with timeout and optional max attempts limit.

Parameters:

  • $iTimeout - Timeout in milliseconds (0 = wait forever)
  • $sImagePath - Image file path(s), multiple separated by "|"
  • $iMaxAttempts - Max number of search attempts (0 = unlimited, default: 0)
  • Other parameters same as _ImageSearch

Returns:

  • Success: 2D Array (same as _ImageSearch)
  • Timeout: Empty array with [0][0] = 0

Example:

; Wait 5 seconds for button (unlimited attempts)
$aResult = _ImageSearch_Wait(5000, "button.png")
If $aResult[0] > 0 Then
    MouseClick("left", $aResult[1][0], $aResult[1][1])
Else
    MsgBox(0, "Timeout", "Button not found")
EndIf

 

_ImageSearch_WaitClick($iTimeout, $sImagePath [, $sButton [, $iClicks [, $iLeft [, $iTop [, $iRight [, $iBottom [, $iScreen [, $iTolerance [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache]]]]]]]]]]]]])

Waits for an image and clicks it when found.

Parameters:

  • $iTimeout - Timeout in milliseconds (0 = wait forever)
  • $sImagePath - Image file path(s)
  • $sButton - Mouse button: "left", "right", "middle" (default: "left")
  • $iClicks - Number of clicks (default: 1)
  • Other parameters same as _ImageSearch

Returns:

  • Success: 1 (image found and clicked)
  • Timeout: 0 (image not found)

 

Monitor Functions

_ImageSearch_Monitor_GetList()

Gets a list of all connected display monitors and their properties.

Returns:

  • Success: The number of monitors found. @extended contains a detailed log.
  • Failure: 0 and sets @error

Remarks:

  • Populates the global $g_aMonitorList
  • Called automatically by _ImageSearch_Startup

 

_ImageSearch_Monitor_ToVirtual($iMonitor, $iX, $iY)

Converts local monitor coordinates to virtual screen coordinates.

Parameters:

  • $iMonitor - The 1-based index of the monitor
  • $iX, $iY - Coordinates relative to the monitor's top-left corner

Returns:

  • Success: A 2-element array [$vX, $vY] containing virtual screen coordinates
  • Failure: 0 and sets @error

 

_ImageSearch_Monitor_FromVirtual($iMonitor, $iX, $iY)

Converts virtual screen coordinates to local monitor coordinates.

Parameters:

  • $iMonitor - The 1-based index of the monitor
  • $iX, $iY - Virtual screen coordinates

Returns:

  • Success: A 2-element array [$lX, $lY] containing local monitor coordinates
  • Failure: 0 and sets @error

 

_ImageSearch_Monitor_Current()

Detects which monitor contains the current mouse cursor position.

Returns:

  • Success: Monitor index (1-based) where the cursor is located
  • Failure: 0 and sets @error

 

_ImageSearch_Monitor_GetAtPosition([$iX [, $iY]])

Returns detailed information string about the monitor at specified position.

Parameters:

  • $iX, $iY - Coordinates (default: -1 = use mouse cursor position)

Returns:

  • Success: String describing the monitor (e.g., "Monitor 2: 1920x1080 (Primary)")
  • Failure: Error message string

 

Window Coordinate Functions

_ImageSearch_Window_ToScreen($hWnd, $iX, $iY [, $bClientArea])

Converts window-relative coordinates to screen (virtual desktop) coordinates.

Parameters:

  • $hWnd - Window handle or title
  • $iX, $iY - Coordinates relative to window
  • $bClientArea - True = relative to client area, False = relative to window (default: True)

Returns:

  • Success: A 2-element array [$screenX, $screenY] containing screen coordinates
  • Failure: 0 and sets @error

 

_ImageSearch_Window_FromScreen($hWnd, $iScreenX, $iScreenY [, $bClientArea])

Converts screen (virtual desktop) coordinates to window-relative coordinates.

Parameters:

  • $hWnd - Window handle or title
  • $iScreenX, $iScreenY - Screen coordinates
  • $bClientArea - True = relative to client area, False = relative to window (default: True)

Returns:

  • Success: A 2-element array [$winX, $winY] containing window-relative coordinates
  • Failure: 0 and sets @error

 

Cache & Info Functions

_ImageSearch_WarmUpCache($sImagePaths [, $bEnableCache])

Pre-loads images into cache for faster subsequent searches.

Parameters:

  • $sImagePaths - Pipe-separated list of images to preload
  • $bEnableCache - Enable persistent cache (default: True)

Returns:

  • Success: Number of images cached
  • Failure: 0

Example:

_ImageSearch_WarmUpCache("btn1.png|btn2.png|icon.png")

 

_ImageSearch_ClearCache()

Clears the internal bitmap and location cache.

Remarks:

  • Useful for freeing memory or forcing re-scan after image updates
  • Clears both in-memory cache and persistent disk cache

 

_ImageSearch_GetDllInfo([$bForceRefresh])

Gets comprehensive DLL information in INI format.

Parameters:

  • $bForceRefresh - Force refresh of cached info (default: True)

Returns: Multi-line string in INI format with sections:

  • [DLL] - DLL name, version, architecture, author
  • [OS] - OS name, version, build, platform
  • [CPU] - Threads, SSE2, AVX2, AVX512 support
  • [SCREEN] - Virtual screen, scale, monitors with individual resolutions
  • [CACHE] - Location cache, bitmap cache, pool size

 

_ImageSearch_GetInfo()

Gets formatted DLL and system information for display.

Returns: Formatted string with DLL info, cache status, and screen information

 

_ImageSearch_GetDllValue($sSection, $sKey)

Quick accessor to read any value from cached DLL Info.

Parameters:

  • $sSection - Section name (DLL, OS, CPU, SCREEN, CACHE)
  • $sKey - Key name

Returns: Value string or "" if not found

Example:

$sVersion = _ImageSearch_GetDllValue("DLL", "Version")
$sOSName = _ImageSearch_GetDllValue("OS", "Name")
$iThreads = _ImageSearch_GetDllValue("CPU", "Threads")

 

_ImageSearch_GetLastResult()

Gets the raw DLL return string from the last search.

Returns: Raw result string (e.g., "{2}[100|200|32|32,150|250|32|32]")

Remarks: Useful for debugging or custom parsing

 

_ImageSearch_GetScale([$iScreen])

Gets the DPI scale factor for a specific monitor as a decimal number.

Parameters:

  • $iScreen - Monitor index (0 = Primary, 1+ = specific monitor number)

Returns: Scale factor as number (e.g., 1.0, 1.25, 1.5) or 0 if not found

Example:

$fScale = _ImageSearch_GetScale(0)  ; Get primary monitor scale (e.g., 1.25)
$fScale = _ImageSearch_GetScale(2)  ; Get monitor 2 scale

 

Examples

Advanced Search with Multiple Images and Scaling

#include "ImageSearchDLL_UDF.au3"

; Search for multiple UI elements with different scales
Local $sImages = "button_ok.png|button_cancel.png|icon_settings.png"
Local $aResult = _ImageSearch($sImages, 0, 0, 1920, 1080, -1, 15, 10, 1, 0.8, 1.3, 0.1, 0, 1)

If $aResult[0] > 0 Then
    ConsoleWrite("Found " & $aResult[0] & " matches:" & @CRLF)
    For $i = 1 To $aResult[0]
        ConsoleWrite("  Match " & $i & ": X=" & $aResult[$i][0] & ", Y=" & $aResult[$i][1] & 
                     ", W=" & $aResult[$i][2] & ", H=" & $aResult[$i][3] & @CRLF)
    Next
Else
    ConsoleWrite("No matches found" & @CRLF)
EndIf

Multi-Monitor Screen Capture

#include "ImageSearchDLL_UDF.au3"

; Get monitor information
_ImageSearch_Monitor_GetList()
ConsoleWrite("Detected " & $g_aMonitorList[0][0] & " monitors" & @CRLF)

; Capture each monitor separately
For $i = 1 To $g_aMonitorList[0][0]
    Local $sFile = @ScriptDir & "\monitor_" & $i & ".png"
    _ImageSearch_ScreenCapture_SaveImage($sFile, 0, 0, 0, 0, $i)
    ConsoleWrite("Captured monitor " & $i & " to: " & $sFile & @CRLF)
Next

; Capture entire virtual desktop
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\virtual_desktop.png", 0, 0, 0, 0, -1)

Automated UI Testing

#include "ImageSearchDLL_UDF.au3"

; Pre-load images for better performance
_ImageSearch_WarmUpCache("login_button.png|username_field.png|password_field.png")

; Wait for login screen and interact
If _ImageSearch_WaitClick(10000, "login_button.png") Then
    ConsoleWrite("Login button clicked" & @CRLF)
    
    ; Find username field and click
    Local $aUsername = _ImageSearch_Wait(5000, "username_field.png")
    If $aUsername[0] > 0 Then
        MouseClick("left", $aUsername[1][0], $aUsername[1][1])
        Send("myusername")
        
        ; Find password field and click
        Local $aPassword = _ImageSearch_Wait(5000, "password_field.png")
        If $aPassword[0] > 0 Then
            MouseClick("left", $aPassword[1][0], $aPassword[1][1])
            Send("mypassword")
            Send("{ENTER}")
        EndIf
    EndIf
Else
    MsgBox(0, "Error", "Login screen not found within 10 seconds")
EndIf

Error Codes

Code Constant Description
-1 $IMGSE_INVALID_PATH Invalid file path
-2 $IMGSE_FAILED_TO_LOAD_IMAGE Failed to load image
-3 $IMGSE_FAILED_TO_GET_SCREEN_DC Failed to get screen device context
-4 $IMGSE_INVALID_SEARCH_REGION Invalid search region
-5 $IMGSE_INVALID_PARAMETERS Invalid parameters
-6 $IMGSE_INVALID_SOURCE_BITMAP Invalid source bitmap
-7 $IMGSE_INVALID_TARGET_BITMAP Invalid target bitmap
-9 $IMGSE_RESULT_TOO_LARGE Result too large
-10 $IMGSE_INVALID_MONITOR Invalid monitor

Performance Tips

  1. Use Cache: Enable cache for repeated searches to get 30-50% speed boost
  2. Pre-load Images: Use _ImageSearch_WarmUpCache() during initialization
  3. Limit Search Area: Specify search regions instead of full screen when possible
  4. Optimize Tolerance: Use appropriate tolerance values (5-15 for most cases)
  5. Use Appropriate Scale Range: Limit scale range to what you actually need
  6. Monitor Selection: Use specific monitor index for faster searches on multi-monitor setups
  7. Image Format: BMP files load faster than PNG/JPG but are larger
  8. Memory Management: Always call _WinAPI_DeleteObject() for HBITMAP handles

Changelog

Version 3.5

  • Added thread-local DPI awareness (no GUI resize issues)
  • Enhanced multi-monitor support with individual monitor scales
  • Improved cache system with persistent disk cache
  • Added _ImageSearch_ScreenCapture_SaveImage() for direct file saving
  • Performance optimizations with SIMD instructions
  • Better error handling and debugging information

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

 Dao Van Trong - TRONG.PRO 


 Thank you for using ImageSearch UDF! 🚀  

 

Support My Work

Enjoy my work? Buy me a 🍻 or tip via ❤️ PayPal


Happy Automating! 🚀

___________________________

👉 Download AutoIt Dll & UDF:  

 

.

.

Edited by Trong
Update document!

Enjoy my work? Buy me a 🍻 or tip via ❤️ PayPal

  • Trong changed the title to ImageSearchDLL v2025.5.25.5 (New restructured version)
  • 2 months later...
  • Trong changed the title to ImageSearchDLL v3.1
  • Trong changed the title to ImageSearchDLL UDF

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...