1

Тема: 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
}

2

Re: AHK: Поиск изображения с вариациями при помощи GDI при включённом Aero

http://forum.script-coding.com/viewtopic.php?id=12938