Back-End

16 mai, 2018

C# – Comparando imagens

Publicidade

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