Форум программистов, компьютерный форум, киберфорум
.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
1

Сравнить два изображения

06.11.2016, 12:41. Показов 2135. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем!

Подскажите, пожалуйста, возможно ли каким-то образом средствами .NET (C# или VB) сравнить два Bitmap с картинками на предмет одинаковости? То есть, скажем, если один Bitmap пиксель в пиксель идентичен второму, то возвращает True, а если хоть одна точка не совпадает, то возвращает False... Можно это как-то сделать без сканирования пикселей обоих Bitmap?

Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2016, 12:41
Ответы с готовыми решениями:

Сравнить два изображения
1.Есть изображение пейзаж, в нем квадрат нарисован. 2.Есть изображение - квадрат. Нужно найти в...

Как сравнить два изображения ?
Как мне узнать являются ли изображения из одного файла, на пример: Image...

Как сравнить два изображения на идентичность?
Как можно сравнить двух изображение на идентичность, то есть на двух изображениях одно и то же...

Подскажите, как сравнить два изображения??
Подскажите, как сравнить два изображения?? Можно даже по названию загруженного файла. Image img1 =...

16
Эксперт .NET
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
Эксперт .NET
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
Эксперт .NET
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
Цитата Сообщение от Usaga Посмотреть сообщение
чушь советовать
почему думаете что это чущь?
0
47 / 47 / 7
Регистрация: 26.12.2014
Сообщений: 189
12.11.2016, 20:10 9
Наверное потому что собрались сжать том до 3х букв))
0
Эксперт .NET
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
13.11.2016, 05:20 10
Цитата Сообщение от asus Посмотреть сообщение
почему думаете что это чущь?
Во-первых, потому, что 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
Эксперт .NET
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
19.11.2016, 16:13 13
Vinemax, стандартные контролы - не панацея, скорее джентельменский набор, для экспериментов и студенческих экспериментов. Ты же не думаешт, что тот же Explorer или Windows Commander полностью на стандартных контролах сделаны?

Насчёт файлов и папок не понял. Для папок используется стандарнтая пиктограмма, если Explorer не найдёт иное в настройках рассматриваемой папке. Тоже самое с EXE-шниками и прочим. Или ты имеешь в виду уже реализацию своего контрола?
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.11.2016, 19:59 14
Цитата Сообщение от Vinemax Посмотреть сообщение
Нашел кучу примеров, но всё не то. А вот недавно нашел пример на базе ListView, который на относительно небольшом количестве файлов в папке работает идеально, а вот зайти, например, в System32, где куча папок и файлов, - ну просто мрак, как медленно перерисовывает значки. Вот и ищу способ в этой теме, как, например, значки файлов или папок, если у этого объекта стандартный (они сразу у меня в кэше), то не обновлять его, а сравнить полученный с имеющимся в кэше и в случае совпадения не обновлять именно этот ListViewItem.
Не надо вам никакое сравнение изображений. Научитесь лучше оптимально работать с данными и контролами.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication352
{
    public partial class Form1 : Form
    {
        private List<string> files = new List<string>();
 
        public Form1()
        {
            InitializeComponent();
            ft.Build(null);
        }
 
        private void ft_NodeSelectedStateChanged(object sender, FastTreeNS.NodeSelectedStateChangedEventArgs e)
        {
            if(e.Selected)
            {
                files = Directory.GetFiles(e.Node as string).ToList();
                fl.Build(files);
            }
        }
 
        private void ft_NodeChildrenNeeded(object sender, FastTreeNS.NodeChildrenNeededEventArgs e)
        {
            try
            {
                var path = e.Node as string;
 
                if (path == null)//root ?
                    e.Children = DriveInfo.GetDrives().Select(d => d.RootDirectory.FullName).ToList();//return driver's list
                else
                    e.Children = Directory.GetDirectories(path);//return subdirs
            }
            catch
            {
                return;//UnauthorizedAccessException
            }
        }
 
        private void ft_NodeTextNeeded(object sender, FastTreeNS.StringNodeEventArgs e)
        {
            var path = e.Node as string;
 
            e.Result = Path.GetFileName(path);
            if (string.IsNullOrEmpty(e.Result))
                e.Result = path;
        }
 
        private void fl_ItemIconNeeded(object sender, FastTreeNS.ImageItemEventArgs e)
        {
            var icon = System.Drawing.Icon.ExtractAssociatedIcon(files[e.ItemIndex]);
            e.Result = icon.ToBitmap().GetThumbnailImage(fl.IconSize.Width, fl.IconSize.Height, null, IntPtr.Zero);
        }
 
        private void fl_ItemTextNeeded(object sender, FastTreeNS.StringItemEventArgs e)
        {
            e.Result = Path.GetFileName(files[e.ItemIndex]);
        }
    }
}
Сравнить два изображения
Вложения
Тип файла: zip WindowsFormsApplication352.zip (128.8 Кб, 10 просмотров)
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...
Вложения
Тип файла: zip ExplorerList.zip (272.9 Кб, 9 просмотров)
1
27.11.2016, 04:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2016, 04:16
Помогаю со студенческими работами здесь

Сравнить 2 изображения Canvas
Приветствую, пытаюсь сравнить 2 изображения, но что-то не получается, я пытаюсь делать так: ...

Сравнить 2 изображения на идентичность
Создаю программу. Программа сравнивает два изображения и если изображения одинаковы, то...

Как сравнить изображения?
я так понимаю нужно использовать перцептивный хэш

Как правильно сравнить изображения?
Доброго времени суток. Перешел на впф и столкнулся с проблемой, что не получается сравнить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru