Автокликер Clickermann :: Форум

Основной раздел => Ошибки => Topic started by: Bob on December 13, 2022, 09:55:38 PM

Title: Странная работа функции PXLXOR
Post by: Bob on December 13, 2022, 09:55:38 PM
Доброго вечера.
Столкнулся со следующей проблемой.
При подсчете контрольной суммы пикселей в заданной области (327, 490, 334, 501) возвращается значение  0 если область меньше чем 12х12.
Code: (clickermann) [Select]
LOGCLEAR
GETSCREEN
$PXLXOR = PXLXOR(327, 490, 334, 501) //контрольная сумма пикселей в области 7х11
LOGWRITE ("$PXLXOR (7х11) = ",$PXLXOR)

$PXLXOR = PXLXOR(327, 490, 339, 502) //контрольная сумма пикселей в области 12х12
LOGWRITE ("$PXLXOR (12х12) = ",$PXLXOR)
 halt


Лог
21:53:35 $PXLXOR (7х11) = 0
21:53:35 $PXLXOR (12х12) = 16579836

В чём здесь проблема?
Версия кликермена 4.13.014 Вин 7х64
Title: Re: Странная работа функции PXLXOR
Post by: kiril on December 14, 2022, 12:54:32 AM
Лог
0:52:22 $PXLXOR (7х11) = 131590
0:52:22 $PXLXOR (12х12) = 7961715
Версия кликермана 4.13.014
Title: Re: Странная работа функции PXLXOR
Post by: Bob on December 14, 2022, 08:20:39 PM
Спасибо за ответ.
 Поэкспериментировав выявил следующее. Если область анализа состоит из пикселей одного цвета и площадь области менее чем 12х12.
Пробовал на программе Paint.NET
 Изначально выявил это на анализе области в которую вписана единица (площадь 7х11). Область состоит из пикселей разного цвета но контрольная сумма функции PXLXOR возвращает 0. Файл изображения в ссылке.
https://disk.yandex.ru/i/cK9IGSJxN-4A5A
Title: Re: Странная работа функции PXLXOR
Post by: Vint on December 15, 2022, 02:39:33 PM
Доброго вечера.
Столкнулся со следующей проблемой.
При подсчете контрольной суммы пикселей в заданной области (327, 490, 334, 501) возвращается значение  0 если область меньше чем 12х12.
Code: (clickermann) [Select]
LOGCLEAR
GETSCREEN
$PXLXOR = PXLXOR(327, 490, 334, 501) //контрольная сумма пикселей в области 7х11
LOGWRITE ("$PXLXOR (7х11) = ",$PXLXOR)

$PXLXOR = PXLXOR(327, 490, 339, 502) //контрольная сумма пикселей в области 12х12
LOGWRITE ("$PXLXOR (12х12) = ",$PXLXOR)
 halt


Лог
21:53:35 $PXLXOR (7х11) = 0
21:53:35 $PXLXOR (12х12) = 16579836

В чём здесь проблема?

Никакой проблемы нет, так и должно работать.
В справке к функции есть уточнение:
Quote
Такой способ не очень надежен в плане получения уникального хеша для простых изображений, но весьма быстр.
Используй PXLCRC и будет тебе счастье.

Чтобы понять почему так получилось, как работает XOR посмотри таблицу истинности для XOR.
Например у тебя есть число в двоичном виде 01010101. Второй операнд 00001111. Ты биты установленные во втором числе (1) ты переключаешь в первом числе биты на противоположные, но только те, которые установлены во втором числе (1)
01010101
00001111
-------------
01011010

Если результат опять сделать XOR с тем же числом, то опять получим первое число

01011010
00001111
-------------
01010101

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

твой зелёный цвет: 8388479
01111111 11111111 01111111

цвет фона: 8355711
01111111 01111111 01111111

Как говорится найди два одно отличие
              0 XOR 01111111 = 01111111
01111111 XOR 01111111 = 00000000

Этот зелёный цвет отличается от фона на 1 бит. Если зелёный встретится в изображении чётное число раз, G канал превратится в 0 и не влияет на остальной подсчёт. С фоном тоже самое. Если и тот и тот чётное - итог 0.

(327, 490, 334, 501) // область 8х12 (не 7х11)  8*12 = 96 - чётное количество пикселов всего и так получилось фон и зелёный тоже оба чётные.
(327, 490, 339, 502) // область 13х13 (не 12х12)  13*13 = 169 операций - нечётное количество всего, какой-то из 2-х (фон или зелёный) обязательно будут нечётными.

Используй PXLCRC и не мучайся.
PXLXOR - если уж очень нужна выгода в миллисекунды и при этом много цветов и большая область. Чем выше применяемый COLORMOD, тем хуже результат, т.к. колормод просто забивает биты справа единицами.

Title: Re: Странная работа функции PXLXOR
Post by: Bob on December 19, 2022, 12:30:52 AM
Премного благодарен за столь развернутый ответ.