Neste artigo vou apresentar uma aplicação Windows Forms para iniciantes na linguagem C#, onde podemos carregar duas imagens e comparar se elas são iguais.
Recursos usados
Criando o projeto Windows Forms
Vamos criar um projeto bem simples do tipo Windows Forms, usando a linguagem C#. No formulário Form1.cs, inclua os seguintes controles a partir da ToolBox:
- 2 LinkLabel: lnklbImagem1 e lnklbImagem2
- 2 PictureBox: picImagem1 e picImagem2
- 1 ProgressBar: 1 pgBar
- 3 Buttons: btnCompararImagens, btnLimpar e btnEncerrar
- 2 OpenFileDialog: ofd1 e ofd2
A seguir, disponha os controles conforme mostra a figura abaixo:
Namespaces usados no projeto:
using System;
using System.Drawing;
using System.Windows.Forms;
Variáveis globais declaradas no formulário:
static string nomeArquivo1, nomeArquivo2;
Bitmap img1, img2;
int contador1 = 0, contador2 = 0;
bool flag = true;
1 – Evento Load do formulário
private void Form1_Load(object sender, EventArgs e) { pgBar1.Visible = false; picImagem1.Visible = true; picImagem2.Visible = true; }
2 – Evento Click do link da primeira imagem
private void lnklbImagem1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { ofd1.FileName = ""; ofd1.Title = "Imagens"; ofd1.Filter = "Todas Imagens|*.jpg; *.bmp; *.png"; pgBar1.Value = 0; pgBar1.Visible = false; ofd1.ShowDialog(); if (ofd1.FileName.ToString() != "") { nomeArquivo1 = ofd1.FileName.ToString(); picImagem1.Image = new Bitmap(nomeArquivo1); } }
3 – Evento Click do link da segunda imagem
private void lnklbImagem2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { ofd2.FileName = ""; ofd2.Title = "Imagens"; ofd2.Filter = "Todas Imagens|*.jpg; *.bmp; *.png"; ofd2.ShowDialog(); if (ofd2.FileName.ToString() != "") { nomeArquivo2 = ofd2.FileName.ToString(); picImagem2.Image = new Bitmap(nomeArquivo2); } }
4 – Evento Click do botão de comando “Comparar Imagens”
private void btnCompararImagens_Click(object sender, EventArgs e) { pgBar1.Visible = true; btnLimpar.Enabled = true; string img1_ref, img2_ref; img1 = new Bitmap(nomeArquivo1); img2 = new Bitmap(nomeArquivo2); pgBar1.Maximum = img1.Width; if (img1.Width == img2.Width && img1.Height == img2.Height) { for (int i = 0; i < img1.Width; i++) { for (int j = 0; j < img1.Height; j++) { img1_ref = img1.GetPixel(i, j).ToString(); img2_ref = img2.GetPixel(i, j).ToString(); if (img1_ref != img2_ref) { contador2++; flag = false; break; } contador1++; } pgBar1.Value++; } if (flag == false) { MessageBox.Show("As imagens não são as mesmas, " + contador2 + " pixels diferentes foram encontrados"); } else { MessageBox.Show("As imagens são as mesmas, " + contador1 + " pixels iguais foram encontrados, e " + contador2 + " pixels incorretos foram encontrados"); } } else { MessageBox.Show("As imagens não podem ser comparadas"); } }
5 – Evento Click dos botões “Encerrar” e “Limpar”
private void btnEncerrar_Click(object sender, EventArgs e) { Application.Exit(); } private void btnLimpar_Click(object sender, EventArgs e) { picImagem1.Image = null; picImagem2.Image = null; pgBar1.Value = 0; }
Executando o projeto teremos o seguinte resultado:
Eu não entrei em detalhes de otimização do código. Talvez exista uma forma mais rápida de fazer a comparação entre duas imagens. Fique à vontade para pesquisar e melhorar o código.
Pegue o projeto completo aqui: ComparaImagens.zip