148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
|
|
1 | |
Сравнить два изображения06.11.2016, 12:41. Показов 2135. Ответов 16
Метки нет (Все метки)
Привет всем!
Подскажите, пожалуйста, возможно ли каким-то образом средствами .NET (C# или VB) сравнить два Bitmap с картинками на предмет одинаковости? То есть, скажем, если один Bitmap пиксель в пиксель идентичен второму, то возвращает True, а если хоть одна точка не совпадает, то возвращает False... Можно это как-то сделать без сканирования пикселей обоих Bitmap? Спасибо!
0
|
06.11.2016, 12:41 | |
Ответы с готовыми решениями:
16
Сравнить два изображения Как сравнить два изображения ? Как сравнить два изображения на идентичность? Подскажите, как сравнить два изображения?? |
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
09.11.2016, 15:02 | 2 |
Vinemax, это можно сделать сравнив их содержимое. Сканировать пиксели не обязательно. Можно получить доступ к памяти содержащей данные изображений и сравнивать их по-байтово. Это на порядки быстрее, чем попиксельное сравнение делать.
1
|
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
|
|
12.11.2016, 06:16 | 3 |
1
|
89 / 89 / 20
Регистрация: 19.02.2010
Сообщений: 966
|
|
12.11.2016, 17:37 | 4 |
я тут чисто случайно.... а нельзя ли получит хэшкоды обоих изображений и сопоставить их?
1
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
12.11.2016, 18:00 | 5 |
asus, конечно можно)))
Добавлено через 1 минуту asus, эксперимента ради попробуй)
1
|
89 / 89 / 20
Регистрация: 19.02.2010
Сообщений: 966
|
|
12.11.2016, 18:31 | 6 |
Usaga, не отказался бы но со временем туговато я же говорю что я тут совсем совсем случайно )))
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
12.11.2016, 18:41 | 7 |
asus, ну нашлось же время чушь советовать
0
|
89 / 89 / 20
Регистрация: 19.02.2010
Сообщений: 966
|
|
12.11.2016, 19:06 | 8 |
0
|
47 / 47 / 7
Регистрация: 26.12.2014
Сообщений: 189
|
|
12.11.2016, 20:10 | 9 |
Наверное потому что собрались сжать том до 3х букв))
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
13.11.2016, 05:20 | 10 |
Во-первых, потому, что GetHashCode() для Bitmap\Image использует реализацию по умолчанию - возвращает значение основанное не на содержимом объекта, а на некотором рандомном значении уникальном внутри потока.
Во-вторых, хеш не может быть уникальным, он имеет свойство выдавать одинаковое значение для разных входных данных (коллизия). А малый размер хеша - всего тридцать два бита - позволяет натыкаться на такую ситуацию часто. В-третьих, побайтово сравнивать содержимое двух изображений куда быстрее, чем рассчитывать для них хеш-значения. Естественно, что речь идёт о своей реализации хеша, ибо дефолтная ничего не считает.
2
|
89 / 89 / 20
Регистрация: 19.02.2010
Сообщений: 966
|
|
13.11.2016, 08:24 | 11 |
Usaga, спасибо!
1
|
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
|
|
19.11.2016, 15:50 [ТС] | 12 |
asus, а вот это интересная мысль... Спасибо! Нужно попробовать. Дело в том, что я пишу проводник Windows, но именно расширенный, такой, как в Windows 7 - 10, с эскизами, крупными иконками и так далее. Нашел кучу примеров, но всё не то. А вот недавно нашел пример на базе ListView, который на относительно небольшом количестве файлов в папке работает идеально, а вот зайти, например, в System32, где куча папок и файлов, - ну просто мрак, как медленно перерисовывает значки. Вот и ищу способ в этой теме, как, например, значки файлов или папок, если у этого объекта стандартный (они сразу у меня в кэше), то не обновлять его, а сравнить полученный с имеющимся в кэше и в случае совпадения не обновлять именно этот ListViewItem.
Добавлено через 6 минут вот эта проблема .NET (C# и VB), что с DataGridView, что с ListView, - когда много элементов, то ужас, как долго перерисовывается. в одном из своих проектов мне даже пришлось вместо DataGridView, использовать DataGrid из старого VB6, который, в сотни раз в итоге быстрее работал.
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
|
|
19.11.2016, 16:13 | 13 |
Vinemax, стандартные контролы - не панацея, скорее джентельменский набор, для экспериментов и студенческих экспериментов. Ты же не думаешт, что тот же Explorer или Windows Commander полностью на стандартных контролах сделаны?
Насчёт файлов и папок не понял. Для папок используется стандарнтая пиктограмма, если Explorer не найдёт иное в настройках рассматриваемой папке. Тоже самое с EXE-шниками и прочим. Или ты имеешь в виду уже реализацию своего контрола?
0
|
19.11.2016, 19:59 | 14 | |||||
Не надо вам никакое сравнение изображений. Научитесь лучше оптимально работать с данными и контролами.
0
|
89 / 89 / 20
Регистрация: 19.02.2010
Сообщений: 966
|
|
26.11.2016, 16:19 | 15 |
Vinemax, и какой же метод был в итего выбран?
0
|
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
|
|
26.11.2016, 23:10 [ТС] | 16 |
asus, получилось на ListView.VirtualMode = True, работает очень быстро не зависимо от количества элементов в самом ListView. Позже выложу код.
0
|
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
|
|
27.11.2016, 04:16 [ТС] | 17 |
Вот прикрепляю пример проводничка на основе ListView c VirtualMode и сторонними классами, реализующими WinAPI. Отображаемая в форме папка выбирается в событии Button1.Click пользовательского элемента ExplorerListView. Пример на VB .NET...
1
|
27.11.2016, 04:16 | |
27.11.2016, 04:16 | |
Помогаю со студенческими работами здесь
17
Сравнить 2 изображения Canvas Сравнить 2 изображения на идентичность Как сравнить изображения? Как правильно сравнить изображения? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |