如何从网格格式的AHK中的gdip库中获取位图数据?

时间:2017-06-19 07:56:47

标签: autohotkey

我正在进行某种图像识别/运动检测,并且需要能够以某种坐标方式从屏幕访问像素数据,这样我才能看到[350,425]处的像素是什么颜色,依此类推。

我最近从屏幕的某个区域询问了a question about getting pixel data。在AHK中查看像素的默认方法非常慢(从1080p屏幕记录数据需要半天时间)。答案似乎是在AHK中使用gdip库,例如:

https://github.com/cswoyer/AutoHotkey/blob/master/ScreenCapture.ahk

但是我不知道如何在处理过程中以我可以使用的格式获取像素数据。我需要通过x,y坐标或遵循某些基本模式的格式访问某种结构中的数据,以便我可以将其重新格式化为网格数据结构并使用它。

我一直在尝试检查我可以尝试使用的任何类型的文本数据的各种变量,但我尝试过的任何一个都没有包含文本或对象数据。

1 个答案:

答案 0 :(得分:0)

我不确定你要完成什么,但是在变量中保存屏幕截图并从那里获取像素应该更快。但是显然拍摄这个截图需要花费几毫秒,所以我不确定这对于"运动检测有多大用处。"

#SingleInstance, Force
SetBatchLines, -1
SetWorkingDir %A_ScriptDir%

#Include Gdip.ahk

pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen() ; Make a screenshot

; Read RGB color from pixel x350 y425
ARGB := Gdip_GetPixel( pBitmap, 350, 425 )
pixelColor := ARGBtoRGB( ARGB )
MsgBox, % pixelColor

; Read RGB color from pixel x345 y567
ARGB := Gdip_GetPixel( pBitmap, 345, 567 )
pixelColor := ARGBtoRGB( ARGB )
MsgBox, % pixelColor


Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)

ARGBtoRGB( ARGB ) {
 VarSetCapacity( RGB,6,0 )
 DllCall( "msvcrt.dll\sprintf", Str,RGB, Str,"%06X", UInt,ARGB<<8 )
 Return "0x" RGB
}

对这两个帖子的看法:
https://autohotkey.com/board/topic/47007-get-pixel-color-from-a-bmp/?p=293766
https://autohotkey.com/board/topic/91427-gdi-how-to-get-bitmap-from-certain-area-of-screen/?p=576860

Gdip.ahk可以在这里找到:https://github.com/tariqporter/Gdip/blob/master/Gdip.ahk