Есть ли простой способ проверить два PNG на равенство? - PullRequest
6 голосов
/ 21 марта 2010

У меня есть куча изображений PNG, и я ищу способ идентифицировать дубликаты. Под дубликатами я имею в виду, в частности, два файла PNG, чьи данные несжатого изображения идентичны, необязательно, файлы которых идентичны. Это означает, что я не могу сделать что-то простое, например сравнить значения хэша CRC.

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

Ответы [ 4 ]

13 голосов
/ 21 марта 2010
  1. фильтр по одинаковому размеру изображения (ширина и высота)
  2. открыть файл
  3. хеш несжатого содержимого (вероятно, md5 подойдет)
  4. хеш магазина

  5. сравнить хэши, чтобы найти идентичные

6 голосов
/ 21 марта 2010

Вместо того, чтобы проходить по всем пикселям, чтобы проверить равенство, возможно, стоит начать с середины и продвигаться вперед.У большинства изображений объект находится посередине, что означает, что здесь находятся дополнительные данные объекта.По сути, гораздо быстрее будет выяснить, отличаются ли две картинки таким образом.

3 голосов
/ 22 марта 2010

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

Кроме того, насколько точным ты должен быть? Например, если проверенные таким образом 10 пикселей одинаковы, можете ли вы с уверенностью сказать, что изображения идентичны? 10 пикселей RGB = 240 бит, поэтому частота ложных совпадений со случайными изображениями должна быть 1 в 2 ^ 240 = 1 в 10 ^ 72!

0 голосов
/ 21 марта 2010

Я полагаю, что вы можете отрегулировать размер читаемых данных, даже если формат хранения совершенно другой. Итак, если ваше изображение 24-битное, вы можете использовать 32-битный или 64-битный (если 64-битный скомпилированный) тип данных и продолжать упаковывать данные в две переменные этих типов из обоих изображений и сравнивать их на равенство. , Это может немного ускорить процесс:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...