Все знают игру "Найдите 10 отличий?" =)
В этой статье я приведу пример простого движка для нее.
Вносим картинки в PictureBox-ы
Для сравнения изображений внесем их в два подготовленных для этого PictureBox`а с помощью OpenFileDialog. Файл с изображение определим функцией SelectImageFile().
Механизм сравнения простой. Берем цвет пикселя из одной картинки. Затем берем пиксель с теми же координатами со второй картинки. Сравниваем их. Если цвета одинаковые, то пропускаем его, если же разные, то запоминаем координаты и цвета. Производим эти действия попиксельно и в цикле. Подобное было показано в статье Создание кнопки нестандартной формы.
Для начала создадим класс «измененного» пикселя – nComparePxl с тремя параметрами: координаты пикселя, цвет на первом изображении и цвет на втором изображении.
publicclass 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 изображения. Необходимо помнить, что размеры должны быть одинаковые, иначе у нас ничего не выйдет. Создаем в этой функции массив элементов, и попиксельно проверяем их идентичность. Если цвета не совпадают, то вносим в массив новый элемент с параметрами координат, на которых остановились, цвета в первом рисунке и цвета во втором рисунке.
Далее переходим к нашей форме и заводим на ней кнопку, по нажатию которой и будет происходить сравнение.
privatevoid 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);
Во-первых, проверяем, не пустые ли у нас боксы. Дальше создаем 2 Bitmap`а из PictureBox`ов и смотрим на их размеры. Если размеры совпадают, то заводим массив list и вносим в него данные, полученные в предыдущем классе. Для наглядности я вывел эти данные через консоль. Как лучше показать изменения на форме, я пока не придумал, но думаю в будущем что-нибудь да и соображу ). А вообще это дело фантазии.
Delegat,спасибо за оболденный пример.Я как раз такое сейчас делаю,мне надо сравнить два image,и показать отличия ну например в третьем pictureBox,но показать надо следующим способом,например если есть различия надо показать их на image обведя например красными квадратиками.Если несложно подскажи как можно такое зделать.Спасибо.
Может быть брать "куски" неидентичных пикселей и обводить их простым кругом, выходящим за рамки. А вообще сегодня после работы сяду и подумаю. Если надумаю, то выложу =).
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