Тема: AHK: Поиск изображения с вариациями при помощи GDI при включённом Aero
Приветствую всех зашедших в эту тему! Ситуация следующая: Как многим известно функции PixelSearch и ImageSearch в AHK работают крайне медленно при включенном Aero. Появилась необходимость как-то ускорить этот процесс и я обратил внимание на GDI+. Поиск изображения оказался достаточно простым даже для новичка вроде меня, но я столкнулся с одной проблемой… В отличие от нативных AHK функций, GDI+ не умеет искать пиксели с вариацией, так же удобно как это делает AHK. Немного порыскав, по офф. форуму я наткнулся, на пользователя предложившего решение этого вопроса. Проблема в том, что в этом самом решении используется DLL написанная на C или C++. Так как я совсем не разбираюсь в вопросах компилирования DLL и с английским не очень дружу, хотел бы попросить помощи здесь. Уважаемые, кто-нибудь может скомпилировать эту DLL? Код самой AHK функции и код для DLL прикладываю. Заранее спасибо!
Dll исходник
extern "C"
{
__declspec(dllexport) int PixelSearch(unsigned char * Bitmap, int Color, int x1, int y1, int x2, int y2, int Stride, int * x, int * y, int v)
{
int tx, ty, o, R, G, B;
int R1 = (Color & 0x00ff0000) >> 16;
int G1 = (Color & 0x0000ff00) >> 8;
int B1 = Color & 0x000000ff;
tx = x1;
for (int w1 = 0; w1 < x2; ++w1)
{
ty = y1;
for (int h1 = 0; h1 < y2; ++h1)
{
o = (4*tx)+(ty*Stride);
R = Bitmap[2+o];
G = Bitmap[1+o];
B = Bitmap[o];
if ((R == R1) && (G == G1) && (B == B1))
{
x[0] = tx; y[0] = ty;
return false;
}
ty++;
}
tx++;
}
x[0] = 0; y[0] = 0;
return true;
}
}
Функция AHK
#SingleInstance, Force
#NoEnv
SetBatchLines, -1
CoordMode, Mouse, Screen
CoordMode, Pixel, Screen
#Include Gdip.ahk
MCode(ByRef code, hex) { ; allocate memory and write Machine Code there
VarSetCapacity(code,StrLen(hex)//2)
Loop % StrLen(hex)//2
NumPut("0x" . SubStr(hex,2*A_Index-1,2), code, A_Index-1, "Char")
}
Gdip_PixelSearch(ByRef x, ByRef y, x1, y1, x2, y2, Color, Variation)
{
MCode(PixelSearch,
(LTrim Join
"83EC0C8B44241453558BE88BC825FF000000C1FD10C1F90881E5FF00000081E1
FF000000837C2428008944240C8B4424205657896C2418894C241089442424C7
442428000000007E758B5424388B5C24348B7C242C33F685DB7E508B4424248B
CF0FAFCA8D04818B4C242003C88D4900BB020000000FB61C0B3BDD751C8B5C24
200FB65C18013B5C241075090FB6193B5C2414744A8B6C24188B5C2434464703
C203CA3BF37CC98B7C242C8B442428FF44242440894424283B4424307C978B54
243C8B4424405F5EC702000000005DC70000000000B8010000005B83C40CC38B
4424248B54243C8B4C2440890289395F5E5D33C05B83C40CC3"
))
pBitmap := Gdip_BitmapFromScreen(), Gdip_GetDimensions(pBitmap, w, h)
E1 := Gdip_LockBits(pBitmap, 0, 0, w, h, Stride, Scan0, BitmapData)
e := DllCall(&PixelSearch,"uint",scan0,"int",color,"int",x1,"int",y1,"int",x2,"int",y2,"int",stride,"int*",x,"int*",y,"uint",v,"cdecl uint")
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
return e
}