1

Тема: AHK: Вариация при поиске пикселей

Всем доброго времени суток.
Есть скрипт:

#include gdip.ahk

n:=0, SearchPixel := 0xFFB5E61D
SetBatchLines, -1
CoordMode, Pixel, screen
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen("461|188|444|444")
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
loop % width
{
   A_Index_X := A_Index-1
   loop % height
   {
      CurrentPixel := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
      if (CurrentPixel = SearchPixel)
         n++
   }
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
msgbox % n

Он ищет количество пикселей в заданной области. Но ищет только определенный цвет.

Как сделать, чтоб скрипт искал не только один конкретный цвет, а и его оттенки с вариацией 10-20.

2 (изменено: serzh82saratov, 2017-08-23 19:24:42)

Re: AHK: Вариация при поиске пикселей

#include gdip.ahk
SetBatchLines, -1
CoordMode, Pixel, screen
pToken := Gdip_Startup()

SearchPixel := 0xFFB5E61D 
variation := 0x12 

pBitmap := Gdip_BitmapFromScreen("461|188|444|444")
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
MsgBox % width * height
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
loop % width + (n:=0)
{
   A_Index_X := A_Index-1
   loop % height
   {
       CurrentPixel := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
      if CompareColors(SearchPixel, CurrentPixel, variation)
         n++
   }
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
msgbox % n

CompareColors(bgr1, bgr2, variation=0) {
	c1 := bgr1 & 0xff
	c2 := bgr2 & 0xff 
	if (abs(c1 - c2) > variation)
		return false
	c1 := (bgr1 >> 8) & 0xff
	c2 := (bgr2 >> 8) & 0xff
	if (abs(c1 - c2) > variation)
		return false
	c1 := (bgr1 >> 16) & 0xff
	c2 := (bgr2 >> 16) & 0xff
	if (abs(c1 - c2) > variation)
		return false
	return true
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

3

Re: AHK: Вариация при поиске пикселей

serzh82saratov Все прекрасно работает. Большое спасибо.

4

Re: AHK: Вариация при поиске пикселей

А не лучше ли не использовать функцию, а просто составить условие в цикле без присваивания каждый раз переменным уже известные значения.
Так как при разрешении монитора 1920x1080 каждое присваивание отнимает 0.3 секунды.

SetBatchLines, -1
a:=a_tickcount
loop % 1920*1080
   var := "z"
msgbox % a_tickcount - a

5 (изменено: serzh82saratov, 2017-08-23 22:07:15)

Re: AHK: Вариация при поиске пикселей

Ты про это:

SetBatchLines, -1
CoordMode, Pixel, screen
pToken := Gdip_Startup()

SearchPixel := 0xFFffffff
variation := 0x11

pBitmap := Gdip_BitmapFromScreen("461|188|444|444")
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap) 
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)

Start := A_TickCount
loop % width + (n:=0)
{
   A_Index_X := A_Index-1
   loop % height
   { 
      if CompareColors(SearchPixel, Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride), variation)
         n++
   }
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
msgbox % n "`n" A_TickCount - Start

CompareColors(bgr1, bgr2, variation=0) { 
	if (abs((bgr1 & 0xff) - (bgr2 & 0xff)) > variation)
		return false 
	if (abs(((bgr1 >> 8) & 0xff) - ((bgr2 >> 8) & 0xff)) > variation)
		return false 
	if (abs(((bgr1 >> 16) & 0xff) - ((bgr2 >> 16) & 0xff)) > variation)
		return false
	return true
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

6

Re: AHK: Вариация при поиске пикселей

Про это:

SetBatchLines, -1
n:= 0, k:= 6
a:=a_tickcount
loop % 1920*1080
{
   if k = 6
      n++   
}
msgbox % n "`n" a_tickcount - a

SetBatchLines, -1
n:= 0, k:= 6
a:=a_tickcount
loop % 1920*1080
{
   if test(k)
      n++   
}
msgbox % n "`n" a_tickcount - a

test(var)
{
   if var = 6
      return true
}

7

Re: AHK: Вариация при поиске пикселей

Спасибо Вам да дискуссию, но второй вариант скрипта работает чуточку быстрей. Если обрабатывать большую область, ускорение заметное.

8

Re: AHK: Вариация при поиске пикселей

Malcev Ну да, так лучше.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

9 (изменено: serzh82saratov, 2017-08-23 23:13:13)

Re: AHK: Вариация при поиске пикселей

Malcev В итоге такой код?

SetBatchLines, -1
CoordMode, Pixel, screen
pToken := Gdip_Startup()

SearchPixel := 0xFFffffff
variation := 0x11

pBitmap := Gdip_BitmapFromScreen("461|188|444|444")
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap) 
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)

Start := A_TickCount
bgr1 := SearchPixel
loop % width + (n:=0)
{
	A_Index_X := A_Index-1
	loop % height
	{ 
		bgr2 := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
		if !(abs((bgr1 & 0xff) - (bgr2 & 0xff)) > variation)
		&& !(abs(((bgr1 >> 8) & 0xff) - ((bgr2 >> 8) & 0xff)) > variation)
		&& !(abs(((bgr1 >> 16) & 0xff) - ((bgr2 >> 16) & 0xff)) > variation)
			n++
	}
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken) 
msgbox % n "`n" A_TickCount - Start
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

10 (изменено: Vicoriyan, 2017-08-23 23:08:30)

Re: AHK: Вариация при поиске пикселей

serzh82saratov Что-то не так. Этот вариант скрипта оттенок 0xFFE6E61E от основного цвета 0xFFB9E61E уже считывает все пиксели при показателе вариации 0х1. Первый и второй вариант скрипта считывает оттенки при показателе вариации 0х30. Если поставить вариацию 0, то и показывает тоже 0.

11

Re: AHK: Вариация при поиске пикселей

Поправил.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

12

Re: AHK: Вариация при поиске пикселей

serzh82saratov Все работает.

13

Re: AHK: Вариация при поиске пикселей

serzh82saratov, да, так уже намного быстрее.

14

Re: AHK: Вариация при поиске пикселей

Появился такой вопрос. Можно сделать так, чтоб скрипт считывал картинку из файла, а не из скрина?

15

Re: AHK: Вариация при поиске пикселей

Gdip_CreateBitmapFromFile вместо Gdip_BitmapFromScreen.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

16

Re: AHK: Вариация при поиске пикселей

Пожалуйста, подскажите, как задать клик по заданному цвету (или самому близкому к нему оттенку) в диапазоне координат экрана от x1230 y80 до x2040 y550?

Win10x64, AHK v1.1.25

17

Re: AHK: Вариация при поиске пикселей

serzh82saratov И далее в круглых скобках имя файла? Или его как-то по другому выносить нужно?

18 (изменено: serzh82saratov, 2017-08-24 23:22:49)

Re: AHK: Вариация при поиске пикселей

becauseim

SetBatchLines, -1
CoordMode, Pixel, screen
CoordMode, Mouse, screen
pToken := Gdip_Startup()

SearchPixel := 0xFFffffff
variation := 0x1

pBitmap := Gdip_BitmapFromScreen("1230|80|" 2040 - 1230 "|" 550 - 80)
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap) 
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)

Start := A_TickCount
bgr1 := SearchPixel
loop % width + (n:=0)
{
	A_Index_X := A_Index-1
	loop % height
	{ 
		bgr2 := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
		if !(abs((bgr1 & 0xff) - (bgr2 & 0xff)) > variation)
		&& !(abs(((bgr1 >> 8) & 0xff) - ((bgr2 >> 8) & 0xff)) > variation)
		&& !(abs(((bgr1 >> 16) & 0xff) - ((bgr2 >> 16) & 0xff)) > variation)
		{
			MouseClick, left, A_Index_X, A_Index-1 
			Break 2
		}
	}
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)  
Return
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

19

Re: AHK: Вариация при поиске пикселей

path = c:\fdfsdf.png
pBitmap := Gdip_CreateBitmapFromFile(path)
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

20

Re: AHK: Вариация при поиске пикселей

serzh82saratov Вот попробовал еще так:

pBitmap := Gdip_CreateBitmapFromFile("payload.png")


Тоже вроде как работает. Расширение .jpg тоже работает.

21

Re: AHK: Вариация при поиске пикселей

Можно и так.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

22

Re: AHK: Вариация при поиске пикселей

Тогда вопрос чем-то похожий на вопрос от becauseim. Если у меня картинка 1200х900 и мне нужно в пределах этого расширения картинки назначить область сканирования 500х500?

23 (изменено: serzh82saratov, 2017-08-24 23:43:49)

Re: AHK: Вариация при поиске пикселей

Указывайте область здесь, вместо нулей х у.

Gdip_LockBits(pBitmap, 0, 0, 500, 500, Stride, Scan0, BitmapData)
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

24

Re: AHK: Вариация при поиске пикселей

serzh82saratov В принципе так и думал, но неуверенность взяла свое. Спасибо большое за разъяснение.

25 (изменено: Vicoriyan, 2017-08-25 19:32:42)

Re: AHK: Вариация при поиске пикселей

serzh82saratov Сегодня проверил и увидел, что не работает. Вставил координаты и назначил поле для сканирования и результата вообще никакого нет.

Gdip_LockBits(pBitmap, 210, 110, 500, 500, Stride, Scan0, BitmapData)

Ошибки тоже нет. Ставлю вместо 210, 110, нули и он мне показывает пиксели всей картинки.