Что нового

PixelCheckSum: сравнение области экрана с картинкой

Igrok

Новичок
Сообщения
5
Репутация
0
Хотел бы воспользоваться функцией Pixelchecksum для сравнения определенной области экрана с имеющейся у меня картинкой в формате bmp (т.е. область как раз размером с эту картинку).
Но нигде как-то не нашел каким образом это можно сделать. Везде где эта функция используется - она сравнивает одну и ту же область экрана по координатам, только в разное время.
Кто подскажет как решить мою проблему? Мне надо каким-то образом вычислить контрольную сумму моей картинки и ее подставлять? Или все-таки функция имеет встроенную возможность?
 

agikon

Знающий
Сообщения
789
Репутация
17
очень интересная тематика, я так понимаю это вы сохранили все картинки с каптчи в отдельную папку а потом хотите чтобы скрипт перебирал все картинки и по контрольной сумме искал нужную.

думаю сделать более чем возможно.
как по мне то трудность заключается именно не как сравнить, а как реализовать чтение с сохранёных файлов. не знаю можно ли считывать контрольную сумму с файлов которые не открыты, а вот например поочереди окрывать все файлы в отдельной программе по просмотру графики и сканировать, ну и чтобы скрипт каждый раз сопоставлял контрольную сумму картинок.
ну и потом или сделать так чтобы точно быть увереным что границы сканирования с экрана и с картинки точно совпадают(а то ж будет контр сумма разная), или сделать небольшой разброс на котрольную сумму.
 
Автор
I

Igrok

Новичок
Сообщения
5
Репутация
0
Спасибо за Ваш ответ. Но мне кажется, что такой способ слишком очевиден и больно уж решением в лоб попахивает.
К тому же это кажется слишком трудоемким и неточным, т.к. каждый раз придется ловить точные границы картинки в это редакторе и т.п.
Тогда уж мне проще для каждой картинки сразу вычислить контрольную сумму и оперировать уже именно готовыми значениями контрольных сумм. Но и такое решение слишком много ручной работы требует.
Может все-таки кто-то варианты попроще знает? Может какая дополнительная функция по вычислению контрольной суммы картинки есть или еще какой хитрый финт?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Можно попробовать так:

1. считываем с искомой области 1й пиксель.
2. считываем с картинки 1й пиксель.
3. ставим условие: если они одинаковы то записываем в переменную 1
4. со следующим пикселем тоже самое, только в переменную уже приплюсовываем 1 и получается 2
5. после считывания всех пикселей, если допустим изображение 100x50, то при полном совпадении картинки в переменной должна быть цифра 5000, если меньше то картинка не совпала.

Но как быстро будет работать - я не знаю, предложил как вариант :smile:

И ещё, для какой цели Вы хотите сравнивать картинку и что с ней будет после сравнения, может можно что - то проще придумать?!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот простой пример. Естественно, размер битмапов должен быть одинаковый, в данном случае 100x100 точек.

Код:
#Include <APIConstants.au3>
#Include <ScreenCapture.au3>
#Include <WinAPIEx.au3>

Dim $pBit[2], $hDib[2], $hBitmap[2]

$hBitmap[0] = _ScreenCapture_Capture('', 0, 0, 99, 99)
$hBitmap[1] = _WinAPI_LoadImage(0, @ScriptDir & '\origin.bmp', $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)

$tSize = _WinAPI_GetBitmapDimension($hBitmap[0])
$hDC = _WinAPI_CreateCompatibleDC(0)
For $i = 0 To 1
	$hDib[$i] = _WinAPI_CreateDIB(DllStructGetData($tSize, 1), DllStructGetData($tSize, 2), 24)
	$pBit[$i] = _WinAPI_GetExtended()
	$hSv = _WinAPI_SelectObject($hDC, $hDib[$i])
	_WinAPI_DrawBitmap($hDC, 0, 0, $hBitmap[$i], $MERGECOPY)
	_WinAPI_SelectObject($hDC, $hSv)
	ConsoleWrite('CRC = ' & _WinAPI_ComputeCrc32($pBit[$i], DllStructGetData($tSize, 1) * DllStructGetData($tSize, 2) * 3) & @CR)
Next
_WinAPI_DeleteDC($hDC)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied,
Класс!!! Спасибо! :thanks:
 
Автор
I

Igrok

Новичок
Сообщения
5
Репутация
0
Yashied
Большое спасибо, думаю это ответ на мой вопрос. :IL_AutoIt_1: Буду пробовать. Надо будет поподробнее разобраться с библиотеками, которые Вы здесь использовали.

С позволения администраторов не буду закрывать тему пока сам или кто-нибудь другой не отпишутся о результатах применения предложенного решения.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
А что тут отписываться, пример более чем на 100% рабочий и эффективный, надёжный и быстрый, что и требуется для быстрого выполнения сравнений. :smile:
 
Автор
I

Igrok

Новичок
Сообщения
5
Репутация
0
Ок, уговорили :smile: Еще раз спасибо уважаемому Yashied
 

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
Yashied [?]
Вот простой пример. Естественно, размер битмапов должен быть одинаковый, в данном случае 100x100 точек.

Бинго=) ты мой супер герой , работает идеально только надо учитывать точный размер картинки и позиции сканируемой области :beer:
 

saansan

Новичок
Сообщения
1
Репутация
0
Cпасибо за метод, остается правильно смоделить образец :smile:
 
Верх