Пятница, 19.04.2024, 23:06
Приветствую Вас Гость | RSS
Главная | БЛОГ | Регистрация | Вход
Меню сайта
Форма входа
Категории раздела
WEB-Дизайн [2]
HTML, CSS, JAVA-Script
PHP [2]
Описание языка, скрипты, работа с MySQL
Технология .NET [6]
C#, ASP, основные принципы
Операционные системы [1]
Linux [1]
Все о Linux.
Бытиё [1]
Моя жизнь, мысли, переживания и размышления...
Поиск
Календарь
«  Апрель 2009  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
27282930
Архив записей
Наш опрос
На каком языке вы предпочитаете программировать?
Всего ответов: 791
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Блог йуного кодера
Главная » 2009 » Апрель » 27 » Сравнение двух рисунков на C#
23:39
Сравнение двух рисунков на C#

Все знают игру "Найдите 10 отличий?" =)
В этой статье я приведу пример простого движка для нее.

Вносим картинки в PictureBox-ы

Для сравнения изображений внесем их в два подготовленных для этого PictureBox`а с помощью OpenFileDialog. Файл с изображение определим функцией SelectImageFile().

private string SelectImgFile(string initialDirectory)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "bmp files (*.bmp)|*.bmp|All files (*.*)|*.*";
            dialog.InitialDirectory = initialDirectory;
            dialog.Title = "Select image file";
            return (dialog.ShowDialog() == DialogResult.OK) ? dialog.FileName : null;
        }Syhi-подсветка кода

Далее создадим функцию, которая будет размещать нужные картинки в боксы.

public void setImage(PictureBox pbox)
{
       string filename = SelectImgFile("C:/");
       Image img = Image.FromFile(filename);
       pbox.Width = img.Width;
       pbox.Height = img.Height;
       pbox.Image = img;
}Syhi-подсветка кода

То есть тут понятно. Выбираем файл и подгоняем размеры бокса под размеры картинки. Помещать их будем посредством двойного клика, то есть:

private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            setImage(pictureBox1);
            pictureBox2.Location = new Point(pictureBox1.Location.X + pictureBox1.Width + 10, pictureBox1.Location.Y);
        }

        private void pictureBox2_DoubleClick(object sender, EventArgs e)
        {
            setImage(pictureBox2);
        }Syhi-подсветка кода

Сравниваем изображения

Механизм сравнения простой. Берем цвет пикселя из одной картинки. Затем берем пиксель с теми же координатами со второй картинки. Сравниваем их. Если цвета одинаковые, то пропускаем его, если же разные, то запоминаем координаты и цвета. Производим эти действия попиксельно и в цикле. Подобное было показано в статье Создание кнопки нестандартной формы.

Для начала создадим класс «измененного» пикселя – nComparePxl с тремя параметрами: координаты пикселя, цвет на первом изображении и цвет на втором изображении.

public class nComparePxl
    {
        private Point pxlPoint;
        private Color pxlColor1;
        private Color pxlColor2;

        public Point PxlPoint
        {
            get { return pxlPoint; }
            set { pxlPoint = value; }
        }
        public Color PxlColor1
        {
            get { return pxlColor1; }
            set { pxlColor1 = value; }
        }
        public Color PxlColor2
        {
            get { return pxlColor2; }
            set { pxlColor2 = value; }
        }
        public nComparePxl() { }

        public nComparePxl(Point pn, Color clr1, Color clr2)
        {
            this.PxlPoint = pn;
            this.PxlColor1 = clr1;
            this.PxlColor2 = clr2;
        }
    }Syhi-подсветка кода

Создадим новый класс, в котором создадим функцию, возвращающую массив всех наших неидентичных пикселей, то есть массив элементов только что созданного класса.

class bmpCompare
    {
        public List<nComparePxl> ArrPixelList(Bitmap bmp1, Bitmap bmp2)
        {
            List<nComparePxl> list = new List<nComparePxl>();
            // Пошел цикл попиксельной проверки
            for (int y = 0; y < bmp1.Height; y++)
            {
                for (int x = 0; x < bmp1.Width; x++)
                {
                    // Если цвета пикселей в одной точке координат не совпадают
                    if (bmp1.GetPixel(x, y) != bmp2.GetPixel(x, y))
                    {
                        nComparePxl ncp = new nComparePxl(new Point(x,y),bmp1.GetPixel(x, y), bmp2.GetPixel(x, y));
                        list.Add(ncp);
                    }
                }
            }
            return list;
        }
    }Syhi-подсветка кода

В нашей функции два входящих параметра: 2 изображения. Необходимо помнить, что размеры должны быть одинаковые, иначе у нас ничего не выйдет. Создаем в этой функции массив элементов, и попиксельно проверяем их идентичность. Если цвета не совпадают, то вносим в массив новый элемент с параметрами координат, на которых остановились, цвета в первом рисунке и цвета во втором рисунке.

Далее переходим к нашей форме и заводим на ней кнопку, по нажатию которой и будет происходить сравнение.

private void button1_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image != null && pictureBox2.Image != null)
            {
                bmpCompare bc = new bmpCompare();
                Bitmap bmp1 = new Bitmap(pictureBox1.Image);
                Bitmap bmp2 = new Bitmap(pictureBox2.Image);
                if (bmp1.Width == bmp2.Width && bmp1.Height == bmp2.Height)
                {
                    List<nComparePxl> list = new List<nComparePxl>();
                    list = bc.ArrPixelList(bmp1, bmp2);

                    if (list == null)
                        MessageBox.Show("Изображения идентичны");
                    else
                    {
                        for (int i = 0; i < list.Count; i++)
                            Console.WriteLine("X: {0}, Y: {1}, Color1: {2}, Color2: {3}"
                                , list[i].PxlPoint.X, list[i].PxlPoint.Y, list[i].PxlColor1, list[i].PxlColor2);
                    }
                }
                else MessageBox.Show("Заданы разные размеры изображений");
            }
            else MessageBox.Show("Выберите нужные изображения");
        }Syhi-подсветка кода

Во-первых, проверяем, не пустые ли у нас боксы. Дальше создаем 2 Bitmap`а из PictureBox`ов и смотрим на их размеры. Если размеры совпадают, то заводим массив list и вносим в него данные, полученные в предыдущем классе. Для наглядности я вывел эти данные через консоль. Как лучше показать изменения на форме, я пока не придумал, но думаю в будущем что-нибудь да и соображу ). А вообще это дело фантазии.

Категория: Технология .NET | Просмотров: 10243 | Добавил: dblog | Теги: сравнение изображений, работа с изображениями, C#, bitmap | Рейтинг: 4.5/2
Всего комментариев: 8
1 Privet  
1
Delegat,спасибо за оболденный пример.Я как раз такое сейчас делаю,мне надо сравнить два image,и показать отличия ну например в третьем pictureBox,но показать надо следующим способом,например если есть различия надо показать их на image обведя например красными квадратиками.Если несложно подскажи как можно такое зделать.Спасибо.

2 dblog  
0
Может быть брать "куски" неидентичных пикселей и обводить их простым кругом, выходящим за рамки. А вообще сегодня после работы сяду и подумаю. Если надумаю, то выложу =).

3 Sharki  
0
Spasibo,budu zhdat.

4 Sharki  
0
Oleg :) ya uzhe dumal ti chto to obnovil,a eto ti prosto pomenyal images.Budu zhdat obnovleniy.Spasibo bolshoe

5 Sharki  
0
2 dblog nu chto kogda pomozhesh.Plizzzzzzzz,ochen nuzhno.Zaranie spasibo.

6 Sharki  
0
Nu chto eshe ne nashol vremeni ?

7 beats by dr dre  
0
At the network’s I wandered. By chance after your web site, read your post. Very fruitful,thank you for sharing. On the Internet, it is hard to find useful information. Thank you

8 triehoots  
0
Супер! Автору - респект:)

[url=http://www.tips2sports.com]опасные виды спорта
[/url]

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Бесплатный хостинг uCozCopyright MyCorp © 2024