Доброго вечера.
Столкнулся со следующей проблемой.
При подсчете контрольной суммы пикселей в заданной области (327, 490, 334, 501) возвращается значение 0 если область меньше чем 12х12.
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
В чём здесь проблема?
Никакой проблемы нет, так и должно работать.
В справке к функции есть уточнение:
Такой способ не очень надежен в плане получения уникального хеша для простых изображений, но весьма быстр.
Используй 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, тем хуже результат, т.к. колормод просто забивает биты справа единицами.