1 (изменено: Vicoriyan, 2017-09-09 15:25:21)

Тема: AHK: Фильтрация пикселей

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

Здесь мне Malcev http://forum.script-coding.com/viewtopi … 23#p118823 помог со скриптом подсчета сколько каких пикселей находится на картинке. Он прекрасно работает.

Теперь у меня возникла другая задача, отфильтровать интересующие пиксели. То есть, создать со списка найденных пикселей, список интересующих пикселей.
Вот сделал, но очень грубо:

SetBatchLines, -1
CoordMode, Pixel, screen
pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile("payload.jpg")
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
Arr:={}
loop % width
{
   A_Index_X := A_Index-1
   loop % height
   {
      CurrentPixel := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
      If Arr.HasKey("" CurrentPixel)
         ++Arr["" CurrentPixel]
      Else
         Arr["" CurrentPixel]:=1
   }
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
For k, in Arr
   res .= k "`n"
FileAppend, %res%`n, kod_1.ini
Sleep, 1300
Loop, Read, kod.txt
{
    var := A_LoopReadLine
    Loop, Read, kod_1.ini
    {
        If var = %A_LoopReadLine%
        {
            FileAppend, %var%`n, kod_2.ini
        }
    }
}
Return

Но проблема состоит в том, что список найденных пикселей скрипт пишет в dec формате, а список интересующих пикселей в обычном формате. Вроде hex формат.

Как мне выйти с этой ситуации?

2

Re: AHK: Фильтрация пикселей

А на какой вы ситуации?
Прочему тема названа "фильтрация пикселей", если ваш вопрос про формат чисел?
"Обычный" формат - это как?
Вам что нужно вообще? Один формат?

Msgbox % s := Format("0x{:x}", 15)
Msgbox % Format("{:d}", s)

3 (изменено: Vicoriyan, 2017-09-09 17:27:11)

Re: AHK: Фильтрация пикселей

stealzy Сейчас мне скрипт дает пиксели в таком формате:
4279441412
4279507205
4279572998
4279638807
4279704584
4279704857
4279769371
4279770377
И так далее.

В списке у меня пиксели записаны в таком формате ARGB:
0xFF061779
0xFFB67602
0xFF880205
0xFFCD4F66
0xFF0958E5
0xFF721E2B
0xFF004337
0xFF1B2849
0xFF182443
И так далее.

В скрипте идет сравнивание, но сравнивание с 0xFF131804 с 4279441412 не происходит.

То, что Вы прописали в ответе я понял, но как это вбить в скрипт, чтоб он полученные пиксели сразу конвертировать в массив в формате ARGB и чтоб я мог спокойно сравнивать.

4

Re: AHK: Фильтрация пикселей

Vicoriyan пишет:

сравнивание с 0xFF131804 с 4279441412 не происходит.

a := 0xFF131804
b := 4279441412
if (a=b)
   msgbox

5 (изменено: ypppu, 2017-09-09 21:22:45)

Re: AHK: Фильтрация пикселей

Но это в том случаи, если я знаю, что 4279441412 = 0xFF131804, а у меня таких пикселей тысячи. Или Вы рекомендуете базу пикселей с чем сравниваю перевести в числовое значение?

6

Re: AHK: Фильтрация пикселей

Vicoriyan пишет:

В скрипте идет сравнивание, но сравнивание с 0xFF131804 с 4279441412 не происходит.

Vicoriyan пишет:

Но это в том случаи, если я знаю, что 4279441412 = 0xFF131804

Сравнение происходит независимо от вашего знания о нем.

7

Re: AHK: Фильтрация пикселей

stealzy
Тогда я еще больше запутался. Переменной а и b присваивается четкое значение. 0xFF131804 с 4279441412 я указал просто для примера. Да, у меня в списке пикселей с чем сравнивать постоянный список пикселей, но список с картинке меняется постоянно. В скрипте документ под именем kod.txt - это постоянный список записанный в формате 0xFF-------, а скрипт выдает список в числовом значении и сохраняет в документе под именем kod_1.ini без букв. Как я могу присвоить переменные со списка kod_1.ini если там десятки тысяч пикселей?

8

Re: AHK: Фильтрация пикселей

Vicoriyan, убрал избыточное цитирование в Вашем сообщении.

9

Re: AHK: Фильтрация пикселей

Vicoriyan, объясните, что вы имеете в начале и что вы хотите в итоге получить.

10

Re: AHK: Фильтрация пикселей

Malcev В начале я имею список пикселей, которые меня интересуют и с которыми я буду работаю (kod.txt). После сканирования картинки я должен получить список интересующих пикселей в документ kod_2.ini, которые есть на картинке и с которыми я буду продолжать работу. Иными словами, мне нужно отфильтровать от всех пикселей что есть на картинке те пиксели, которые меня интересуют и составить отдельный их список.

11

Re: AHK: Фильтрация пикселей

Arr:={}
Arr["" 0xff000000]:=Arr["" 0xffffffff]:=0
SetBatchLines, -1
CoordMode, Pixel, screen
SetFormat, IntegerFast, hex
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen()
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 Arr.HasKey("" CurrentPixel)
         ++Arr["" CurrentPixel]
   }
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
SetFormat, IntegerFast, dec
For k, v in Arr
   res .= k " - " v "`n"
MsgBox % res

12

Re: AHK: Фильтрация пикселей

Malcev Сейчас ищет тока два пикселя. Как мне добавить весь свой список пикселей?

13

Re: AHK: Фильтрация пикселей

Думаю, это вы уже сами можете догадаться.

14

Re: AHK: Фильтрация пикселей

Malcev Спасибо, что верите в мои силы. Да, я догадался как добавлять пиксели и все прекрасно считает. Но еще вопрос, как сделать, чтоб пиксель, который не был найден, вообще не входил в список. Сейчас скрипт пишет например, что 0xff000000 - стока-то, а 0xffffffff - стока-то, а если например пикселя 0xffffffff = 0, то и в сообщении показывает 0. Но я хочу, чтоб если пиксель 0xffffffff равен 0, то чтоб в сообщении он даже не упоминался, а только выводились результаты тех пикселей, которые не равны 0.

15 (изменено: stealzy, 2017-09-12 11:33:56)

Re: AHK: Фильтрация пикселей

Vicoriyan
Если (КолвоПикселей = 0) То
    Продолжить
Иначе
    Результат := Результат  Пиксель " - " КолвоПикселей "`n"

16

Re: AHK: Фильтрация пикселей

stealzy Я понял, что Вы имеете ввиду, но что-то я в затруднении как вписать это в скрипт.

17

Re: AHK: Фильтрация пикселей

Вписать туда, где идет перечисление ключей и их значений:

For k, v in Arr
   res .= k " - " v "`n"
MsgBox % res

18

Re: AHK: Фильтрация пикселей

Malcev Это я понял, что в этот блок. Но я что-то не пойму как?

19

Re: AHK: Фильтрация пикселей

Расставьте msgbox, будет понятнее.

For k, v in Arr
{
   msgbox % v
   msgbox % res .= k " - " v "`n"
}

20 (изменено: Vicoriyan, 2017-09-12 21:19:07)

Re: AHK: Фильтрация пикселей

Malcev Все равно не могу понять как использовать http://forum.script-coding.com/viewtopi … 80#p119280.
Я добился нужного результата тока через это:

For k, v in Arr
If v > 0
  {
     res .= k " - " v "`n"
  }
msgbox % res

21

Re: AHK: Фильтрация пикселей

For k, v in Arr
{
   If (v = 0)
      Continue
   Else
      res .= k " - " v "`n"
}
msgbox % res

22

Re: AHK: Фильтрация пикселей

Malcev Как по мне, мой вариант проще) Но все равно спасибо.

23

Re: AHK: Фильтрация пикселей

Malcev А можно использовать вариацию? Например скрипт ищет 0xFFB67602, но если попадется подобный, то скрипт бы присваивал этому цвету значение 0xFFB67602.

24

Re: AHK: Фильтрация пикселей

Не вижу никаких препятствий.

25

Re: AHK: Фильтрация пикселей

Malcev И как адаптировать этот код?

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)

Мозгов пока у меня на это не хватает.

26

Re: AHK: Фильтрация пикселей

Сделать цикл: "For k in Arr".
В него вставить ваш код с вариацией.
Заменить bgr2 на CurrentPixel, а bgr1 на k.
Если совпадение есть, то увеличить значение ++Arr["" k] и выйти из цикла.

27 (изменено: Vicoriyan, 2017-09-13 21:58:18)

Re: AHK: Фильтрация пикселей

Malcev Сделал и ничего не происходит. Скрипт зависает и результатов никаких не дает. Ошибок тоже не показывает.

28

Re: AHK: Фильтрация пикселей

Этот код вроде работает, но доверять результатам не могу. Вариация срабатывает только при значении 100.

variation := 0x5
Arr:={}
Arr["" 0xFFFFC90E]:=Arr["" 0xFFB5E61D]:=Arr["" 0xFF00A2E8]:=0
SetBatchLines, -1
CoordMode, Pixel, screen
SetFormat, IntegerFast, hex
pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile("payload.png")
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 Arr.HasKey("" CurrentPixel)
         ++Arr["" CurrentPixel]
      For k in Arr
      {
      CurrentPixel := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
      if !(abs((k & 0xff) - (CurrentPixel & 0xff)) > variation)
      && !(abs(((k >> 8) & 0xff) - ((CurrentPixel >> 8) & 0xff)) > variation)
      && !(abs(((k >> 16) & 0xff) - ((CurrentPixel >> 16) & 0xff)) > variation)
        ++Arr["" k] 
      } 
   }
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
SetFormat, IntegerFast, dec
For k, v in Arr
{
   If (v = 0)
      Continue
   Else
      res .= k "`n"
}
msgbox % res

29

Re: AHK: Фильтрация пикселей

Это надо убрать:

      If Arr.HasKey("" CurrentPixel)
         ++Arr["" CurrentPixel]

И убрать из цикла For k in Arr

      CurrentPixel := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)

Можно еще после   ++Arr["" k] добавить Break.

30

Re: AHK: Фильтрация пикселей

Malcev Работает. А для чего нужен Break перед ++Arr["" k]? На что он влияет и почему необязателен?

31

Re: AHK: Фильтрация пикселей

Он может быть нужен не перед, а после, для того чтобы при нахождении соответствия пикселей прервать цикл перебирания оставшихся пикселей.

{
   ++Arr["" k] 
   break
}

32

Re: AHK: Фильтрация пикселей

Malcev Понял и заметно быстрее выдается результат.

33 (изменено: Vicoriyan, 2017-09-20 16:15:18)

Re: AHK: Фильтрация пикселей

Malcev Столкнулся с такой проблемой. Начал пользоваться скриптом и по мере работы добавлял в базу пиксели. И тут добавляю +1 пиксель - ошибка, удаляю 1 пиксель, скрипт работает. Не знал, что количество ограничено или я что-то не так делаю?


variation := 0x3
Arr:={}
Arr["" 0xFF061779]:=Arr["" 0xFFB67602]:=Arr["" 0xFF880205]:=Arr["" 0xFFCD4F66]:=Arr["" 0xFF0958E5]:=Arr["" 0xFF721E2B]:=Arr["" 0xFF004337]:=Arr["" 0xFF1B2849]:=Arr["" 0xFF182443]:=Arr["" 0xFF183966]:=Arr["" 0xFF61222D]:=Arr["" 0xFF052F67]:=Arr["" 0xFF3B5A88]:=Arr["" 0xFFBC944C]:=Arr["" 0xFFE1E6A7]:=Arr["" 0xFF054BAD]:=Arr["" 0xFF003BA7]:=Arr["" 0xFF27AF9B]:=Arr["" 0xFFB02F2A]:=Arr["" 0xFF005947]:=Arr["" 0xFF8C4637]:=Arr["" 0xFF379E80]:=Arr["" 0xFF937726]:=Arr["" 0xFF9C6006]:=Arr["" 0xFF212876]:=Arr["" 0xFF004236]:=Arr["" 0xFF007268]:=Arr["" 0xFF0A3B26]:=Arr["" 0xFF0D372C]:=Arr["" 0xFFA9444C]:=Arr["" 0xFF335382]:=Arr["" 0xFFC9A374]:=Arr["" 0xFF466278]:=Arr["" 0xFF376058]:=Arr["" 0xFF275A47]:=Arr["" 0xFF896515]:=Arr["" 0xFF7A5202]:=Arr["" 0xFF32425D]:=Arr["" 0xFF9B3316]:=Arr["" 0xFF002667]:=Arr["" 0xFF590817]:=Arr["" 0xFF31AE8E]:=Arr["" 0xFFE63746]:=Arr["" 0xFF07246A]:=Arr["" 0xFF01185E]:=Arr["" 0xFF041D45]:=Arr["" 0xFF365243]:=Arr["" 0xFF450915]:=Arr["" 0xFF16215F]:=Arr["" 0xFF521620]:=Arr["" 0xFF527071]:=Arr["" 0xFFAA8A85]:=Arr["" 0xFF855907]:=Arr["" 0xFF8C5814]:=Arr["" 0xFF0272E1]:=Arr["" 0xFFC68A91]:=Arr["" 0xFF0758CA]:=Arr["" 0xFF6C2132]:=Arr["" 0xFF574405]:=Arr["" 0xFF9D465F]:=Arr["" 0xFF5E1416]:=Arr["" 0xFF15433A]:=Arr["" 0xFF3F4954]:=Arr["" 0xFF71614A]:=Arr["" 0xFF016759]:=Arr["" 0xFFAB3B37]:=Arr["" 0xFF032DBE]:=Arr["" 0xFF014E3E]:=Arr["" 0xFF4E8889]:=Arr["" 0xFFF4F9D5]:=Arr["" 0xFF1A4E41]:=Arr["" 0xFF8B6915]:=0
SetBatchLines, -1
CoordMode, Pixel, screen
SetFormat, IntegerFast, hex
pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile("payload.png")
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)
      For k in Arr
      {
      if !(abs((k & 0xff) - (CurrentPixel & 0xff)) > variation2)
      && !(abs(((k >> 8) & 0xff) - ((CurrentPixel >> 8) & 0xff)) > variation)
      && !(abs(((k >> 16) & 0xff) - ((CurrentPixel >> 16) & 0xff)) > variation)
         {
            ++Arr["" k] 
            break
         }
      } 
   }
}
SetFormat, IntegerFast, dec
For k, v in Arr
{
   If (v = 0)
      Continue
   Else
      res .= k "`n"
}
msgbox % res

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

34

Re: AHK: Фильтрация пикселей

То что не вмещается перенесите на следующую строку:

a1:=a2:=a3:=0
b1:=b2:=b3:=0

35 (изменено: stealzy, 2017-09-20 18:49:00)

Re: AHK: Фильтрация пикселей

Можно попроще:

Пиксели_Список := [0xFF061779, 0xFFB67602, 0xFF880205, 0xFFCD4F66, 0xFF0958E5, 0xFF721E2B, 0xFF004337, 0xFF1B2849, 0xFF182443, 0xFF183966, 0xFF61222D, 0xFF052F67, 0xFF3B5A88, 0xFFBC944C, 0xFFE1E6A7, 0xFF054BAD, 0xFF003BA7, 0xFF27AF9B, 0xFFB02F2A, 0xFF005947, 0xFF8C4637, 0xFF379E80, 0xFF937726, 0xFF9C6006, 0xFF212876, 0xFF004236, 0xFF007268, 0xFF0A3B26, 0xFF0D372C, 0xFFA9444C, 0xFF335382, 0xFFC9A374, 0xFF466278, 0xFF376058, 0xFF275A47, 0xFF896515, 0xFF7A5202, 0xFF32425D, 0xFF9B3316, 0xFF002667, 0xFF590817, 0xFF31AE8E, 0xFFE63746, 0xFF07246A, 0xFF01185E, 0xFF041D45, 0xFF365243, 0xFF450915, 0xFF16215F, 0xFF521620, 0xFF527071, 0xFFAA8A85, 0xFF855907, 0xFF8C5814, 0xFF0272E1, 0xFFC68A91, 0xFF0758CA, 0xFF6C2132, 0xFF574405, 0xFF9D465F, 0xFF5E1416, 0xFF15433A, 0xFF3F4954, 0xFF71614A, 0xFF016759, 0xFFAB3B37, 0xFF032DBE, 0xFF014E3E, 0xFF4E8889, 0xFFF4F9D5, 0xFF1A4E41, 0xFF8B6915]

КоличествоНайденныхПикселей_Таблица:={} ; создаем таблицу
For k, v in Пиксели_Список
	КоличествоНайденныхПикселей_Таблица[v ""] := 0 ; заполняем столбец кол-во нулями

For k, v in КоличествоНайденныхПикселей_Таблица
	Msgbox % k " " v

Malcev, не в курсе почему асоциативный массив интерпетирует ключи-числа больше двух с чем-то миллиардов как отрицательные?

36 (изменено: Malcev, 2017-09-20 21:44:24)

Re: AHK: Фильтрация пикселей

Integer keys are stored using the native signed integer type. AutoHotkey 32-bit supports integer keys in the range -2147483648 to 2147483647. AutoHotkey supports 64-bit integers, but only AutoHotkey 64-bit supports the full range as keys in an object.

https://autohotkey.com/docs/Objects.htm

37

Re: AHK: Фильтрация пикселей

Malcev Можно использовать в этом варианте скрипта маленькие картинки вместо пикселей? Или же нужно кардинально другой подход?

38

Re: AHK: Фильтрация пикселей

Другой.
https://github.com/MasterFocus/AutoHotk … mageSearch