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)

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