Rehber C# Resim karşılaştırma

Merhaba.
Bugün sizlere C# ile resim karşılaştırmayı göstereceğim.

Makalemiz 3 ana maddeden oluşuyor;
  • Resim Karşılaştırma
  • Resim İşleme (Image Processing)
  • Resim Hash Alma
1683363209407.png


Resim Karşılaştırma

Resim karşılaştırma
, 2 veya daha fazla görseli aynı olup olmadığını denetlemek için yapılan işleme denir. Daha çok görsel üzerinde oynama olup olmadığını tespit etmek için kullanılır. Bugün sizlere bunun nasıl yapıldığını güzel bir şekilde göstereceğim.

Resim İşleme

Resim işleme
, görsel üzerinde farklı işlemler yapmak için kullanılır. Görselin rengini, boyutunu, parlaklığını, doygunluğu değiştirmek için kullanılır yaygın olarak. Onun dışında görseli döndürme, kırpma gibi işlemler için kullanılabilir.

Resim Hash Alma

Resim Hash alma
, bugün size göstereceğim görsel karşılaştırma yöntemlerinden bir tanesi. Görsel karşılaştırma yapmanın birden çok yöntemi vardır. Bitmap ile karşılaştırma yapılabilir. Ancak donanım gücü ister ve yavaştır. Bugün size göstereceğim işlem ise o kadar hızlı ki işlemi başlatmakla bitmesi bir olur.

Haydi başlayalım;

Öncelike böyle bir Form tasarımı yaptım;

İçeriği;
  • 3 Button
  • 2 PictureBox
  • 1 Label
  • 1 BackgroundWorker
1683360278074.png


Gerekli kitaplıklar;

C#:
using System;
using System.IO;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using System.Security.Cryptography;

Global alana 2 adet değişken ve 1 adet List ekliyoruz;

C#:
string image_1, image_2;
List<string> hash_values = new List<string>();

Şimdi 1.resim isimli butona şu kodları giriyoruz;

C#:
OpenFileDialog open_image = new OpenFileDialog{
    InitialDirectory = @"C:\Users\" + SystemInformation.UserName + @"\Desktop\",
    Title = "Görsel seçiniz",
    Multiselect = false,
    Filter = "Resim Dosyaları |*.jpg;*.jpeg;*.png;*.gif;*.tif;..."
};
if (open_image.ShowDialog() == DialogResult.OK){
    image_1 = open_image.FileName;
    image_1_pb.BackgroundImage = Image.FromFile(image_1);
}

Şimdi 2.resim isimli butona şu kodları giriyoruz;

C#:
OpenFileDialog open_image = new OpenFileDialog{
    InitialDirectory = @"C:\Users\" + SystemInformation.UserName + @"\Desktop\",
    Title = "Görsel seçiniz",
    Multiselect = false,
    Filter = "Resim Dosyaları |*.jpg;*.jpeg;*.png;*.gif;*.tif;..."
};
if (open_image.ShowDialog() == DialogResult.OK){
    image_2 = open_image.FileName;
    image_2_pb.BackgroundImage = Image.FromFile(image_2);
}

BackgroundWorker BG_Worker olayını bu kodları giriyoruz;

C#:
            // seçilen resimleri listeye ekliyoruz
            List<string> images_files = new List<string>(){ image_1, image_2 };

            // döngü ile art arda görselleri hashliyoruz
            for (int i = 0; i<= images_files.Count - 1; i++){
                try{
                    string file_path = images_files[i];
                    byte[] buffer;
                    int bytes_read;
                    long size;
                    long total_bytes_read = 0;

                    using (Stream file = File.OpenRead(file_path)){
                        size = file.Length;
                        // SHA 384 kullandığımız için aynı Hash değeri gelmesi neredeyse imkansızdır.
                        using (HashAlgorithm hasher = SHA384.Create()){
                            do{
                                buffer = new byte[8192]; // 8KB aralıklarla belleğe toplu olarak yazacak
                                bytes_read = file.Read(buffer, 0, buffer.Length);
                                total_bytes_read += bytes_read;
                                hasher.TransformBlock(buffer, 0, bytes_read, null, 0);
                                backgroundWorker1.ReportProgress((int)((double)total_bytes_read / size * 100));
                            }while (bytes_read != 0);
                            hasher.TransformFinalBlock(buffer, 0, 0);
                            hash_values.Add(HashStringRotate(hasher.Hash));
                        }
                    }
                }catch (Exception){ }
            }

BackgroundWorker ProgressChanged olayına bu kodları giriyoruz;

C#:
Text = "%" + e.ProgressPercentage;

BackgroundWorker ProgressComplated olayına bu kodları giriyoruz;

C#:
if (hash_values[0] == hash_values[1]){
    label1.Text = "Değerler eşleşiyor";
}else{
    label1.Text = "Değerler eşleşmiyor";
}
// Hash sonuçlarını temizliyoruz
hash_values.Clear();
// başlığı işlem bitince eski haline getirme
Text = Application.ProductName;

Hash değerini okunabilir hale getirmek için Byte işleme Void'i yapıyoruz;

C#:
private static string HashStringRotate(byte[] hash_bytes){
    StringBuilder hash = new StringBuilder(32);
foreach (byte be in hash_bytes){
    hash.Append(be.ToString("X2").ToUpper());
    }
    return hash.ToString();
}

Karşılaştırma isimli butona şu kodları giriyoruz;

C#:
if (image_1 != "" || image_1 != string.Empty && image_2 != "" || image_2 != string.Empty){
    backgroundWorker1.RunWorkerAsync();
}else{
    MessageBox.Show("Görselleri seçiniz.");
}

Şimdi test etme zamanı;

Farklı görseller;


1683361888949.png


Aynı görseller;

1683361910077.png


Aynı olup boyutu farklı görseller;

1683361953787.png


Gördülüğü gibi, aynı görsel dahi olsa 1 Byte bile içeriği değişse eşleşmiyor der.
İşinize yaradıysa ne mutlu.

İyi çalışmalar, iyi Sosyal'ler
😎

İşine yarayacağını düşündüğüm kişiler;
@Vavien. @The Shorekeeper @Emir M. @Astiva @walter wick @Pembiş Gitar @TheAny
 
Sizden beklendiği gibi renkli renkli, çok güzel bir rehber daha. Elinize sağlık.
 
Merhaba.
Bugün sizlere C# ile resim karşılaştırmayı göstereceğim.

Makalemiz 3 ana maddeden oluşuyor;
  • Resim Karşılaştırma
  • Resim İşleme (Image Processing)
  • Resim Hash Alma
Eki Görüntüle 1768240

Resim Karşılaştırma

Resim karşılaştırma
, 2 veya daha fazla görseli aynı olup olmadığını denetlemek için yapılan işleme denir. Daha çok görsel üzerinde oynama olup olmadığını tespit etmek için kullanılır. Bugün sizlere bunun nasıl yapıldığını güzel bir şekilde göstereceğim.

Resim İşleme

Resim işleme
, görsel üzerinde farklı işlemler yapmak için kullanılır. Görselin rengini, boyutunu, parlaklığını, doygunluğu değiştirmek için kullanılır yaygın olarak. Onun dışında görseli döndürme, kırpma gibi işlemler için kullanılabilir.

Resim Hash Alma

Resim Hash alma
, bugün size göstereceğim görsel karşılaştırma yöntemlerinden bir tanesi. Görsel karşılaştırma yapmanın birden çok yöntemi vardır. Bitmap ile karşılaştırma yapılabilir. Ancak donanım gücü ister ve yavaştır. Bugün size göstereceğim işlem ise o kadar hızlı ki işlemi başlatmakla bitmesi bir olur.

Haydi başlayalım;

Öncelike böyle bir Form tasarımı yaptım;

İçeriği;
  • 3 Button
  • 2 PictureBox
  • 1 Label
  • 1 BackgroundWorker
Eki Görüntüle 1768199

Gerekli kitaplıklar;

C#:
using System;
using System.IO;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using System.Security.Cryptography;

Global alana 2 adet değişken ve 1 adet List ekliyoruz;

C#:
string image_1, image_2;
List<string> hash_values = new List<string>();

Şimdi 1.resim isimli butona şu kodları giriyoruz;

C#:
OpenFileDialog open_image = new OpenFileDialog{
    InitialDirectory = @"C:\Users\" + SystemInformation.UserName + @"\Desktop\",
    Title = "Görsel seçiniz",
    Multiselect = false,
    Filter = "Resim Dosyaları |*.jpg;*.jpeg;*.png;*.gif;*.tif;..."
};
if (open_image.ShowDialog() == DialogResult.OK){
    image_1 = open_image.FileName;
    image_1_pb.BackgroundImage = Image.FromFile(image_1);
}

Şimdi 2.resim isimli butona şu kodları giriyoruz;

C#:
OpenFileDialog open_image = new OpenFileDialog{
    InitialDirectory = @"C:\Users\" + SystemInformation.UserName + @"\Desktop\",
    Title = "Görsel seçiniz",
    Multiselect = false,
    Filter = "Resim Dosyaları |*.jpg;*.jpeg;*.png;*.gif;*.tif;..."
};
if (open_image.ShowDialog() == DialogResult.OK){
    image_2 = open_image.FileName;
    image_2_pb.BackgroundImage = Image.FromFile(image_2);
}

BackgroundWorker BG_Worker olayını bu kodları giriyoruz;

C#:
            // seçilen resimleri listeye ekliyoruz
            List<string> images_files = new List<string>(){ image_1, image_2 };

            // döngü ile art arda görselleri hashliyoruz
            for (int i = 0; i<= images_files.Count - 1; i++){
                try{
                    string file_path = images_files[i];
                    byte[] buffer;
                    int bytes_read;
                    long size;
                    long total_bytes_read = 0;

                    using (Stream file = File.OpenRead(file_path)){
                        size = file.Length;
                        // SHA 384 kullandığımız için aynı Hash değeri gelmesi neredeyse imkansızdır.
                        using (HashAlgorithm hasher = SHA384.Create()){
                            do{
                                buffer = new byte[8192]; // 8KB aralıklarla belleğe toplu olarak yazacak
                                bytes_read = file.Read(buffer, 0, buffer.Length);
                                total_bytes_read += bytes_read;
                                hasher.TransformBlock(buffer, 0, bytes_read, null, 0);
                                backgroundWorker1.ReportProgress((int)((double)total_bytes_read / size * 100));
                            }while (bytes_read != 0);
                            hasher.TransformFinalBlock(buffer, 0, 0);
                            hash_values.Add(HashStringRotate(hasher.Hash));
                        }
                    }
                }catch (Exception){ }
            }

BackgroundWorker ProgressChanged olayına bu kodları giriyoruz;

C#:
Text = "%" + e.ProgressPercentage;

BackgroundWorker ProgressComplated olayına bu kodları giriyoruz;

C#:
if (hash_values[0] == hash_values[1]){
    label1.Text = "Değerler eşleşiyor";
}else{
    label1.Text = "Değerler eşleşmiyor";
}
// Hash sonuçlarını temizliyoruz
hash_values.Clear();
// başlığı işlem bitince eski haline getirme
Text = Application.ProductName;

Hash değerini okunabilir hale getirmek için Byte işleme Void'i yapıyoruz;

C#:
private static string HashStringRotate(byte[] hash_bytes){
    StringBuilder hash = new StringBuilder(32);
foreach (byte be in hash_bytes){
    hash.Append(be.ToString("X2").ToUpper());
    }
    return hash.ToString();
}

Karşılaştırma isimli butona şu kodları giriyoruz;

C#:
if (image_1 != "" || image_1 != string.Empty && image_2 != "" || image_2 != string.Empty){
    backgroundWorker1.RunWorkerAsync();
}else{
    MessageBox.Show("Görselleri seçiniz.");
}

Şimdi test etme zamanı;

Farklı görseller;


Eki Görüntüle 1768218

Aynı görseller;

Eki Görüntüle 1768219

Aynı olup boyutu farklı görseller;

Eki Görüntüle 1768220

Gördülüğü gibi, aynı görsel dahi olsa 1 Byte bile içeriği değişse eşleşmiyor der.
İşinize yaradıysa ne mutlu.

İyi çalışmalar, iyi Sosyal'ler
😎

İşine yarayacağını düşündüğüm kişiler;
@Vavien. @The Shorekeeper @Emir M. @Astiva @walter wick @Pembiş Gitar @TheAny
C# işlerine giriştiğimde bunlar çok işime yarayacak hocam ellerinize sağlık :)
 
Merhaba.
Bugün sizlere C# ile resim karşılaştırmayı göstereceğim.

Makalemiz 3 ana maddeden oluşuyor;
  • Resim Karşılaştırma
  • Resim İşleme (Image Processing)
  • Resim Hash Alma
Eki Görüntüle 1768240

Resim Karşılaştırma

Resim karşılaştırma
, 2 veya daha fazla görseli aynı olup olmadığını denetlemek için yapılan işleme denir. Daha çok görsel üzerinde oynama olup olmadığını tespit etmek için kullanılır. Bugün sizlere bunun nasıl yapıldığını güzel bir şekilde göstereceğim.

Resim İşleme

Resim işleme
, görsel üzerinde farklı işlemler yapmak için kullanılır. Görselin rengini, boyutunu, parlaklığını, doygunluğu değiştirmek için kullanılır yaygın olarak. Onun dışında görseli döndürme, kırpma gibi işlemler için kullanılabilir.

Resim Hash Alma

Resim Hash alma
, bugün size göstereceğim görsel karşılaştırma yöntemlerinden bir tanesi. Görsel karşılaştırma yapmanın birden çok yöntemi vardır. Bitmap ile karşılaştırma yapılabilir. Ancak donanım gücü ister ve yavaştır. Bugün size göstereceğim işlem ise o kadar hızlı ki işlemi başlatmakla bitmesi bir olur.

Haydi başlayalım;

Öncelike böyle bir Form tasarımı yaptım;

İçeriği;
  • 3 Button
  • 2 PictureBox
  • 1 Label
  • 1 BackgroundWorker
Eki Görüntüle 1768199

Gerekli kitaplıklar;

C#:
using System;
using System.IO;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using System.Security.Cryptography;

Global alana 2 adet değişken ve 1 adet List ekliyoruz;

C#:
string image_1, image_2;
List<string> hash_values = new List<string>();

Şimdi 1.resim isimli butona şu kodları giriyoruz;

C#:
OpenFileDialog open_image = new OpenFileDialog{
    InitialDirectory = @"C:\Users\" + SystemInformation.UserName + @"\Desktop\",
    Title = "Görsel seçiniz",
    Multiselect = false,
    Filter = "Resim Dosyaları |*.jpg;*.jpeg;*.png;*.gif;*.tif;..."
};
if (open_image.ShowDialog() == DialogResult.OK){
    image_1 = open_image.FileName;
    image_1_pb.BackgroundImage = Image.FromFile(image_1);
}

Şimdi 2.resim isimli butona şu kodları giriyoruz;

C#:
OpenFileDialog open_image = new OpenFileDialog{
    InitialDirectory = @"C:\Users\" + SystemInformation.UserName + @"\Desktop\",
    Title = "Görsel seçiniz",
    Multiselect = false,
    Filter = "Resim Dosyaları |*.jpg;*.jpeg;*.png;*.gif;*.tif;..."
};
if (open_image.ShowDialog() == DialogResult.OK){
    image_2 = open_image.FileName;
    image_2_pb.BackgroundImage = Image.FromFile(image_2);
}

BackgroundWorker BG_Worker olayını bu kodları giriyoruz;

C#:
            // seçilen resimleri listeye ekliyoruz
            List<string> images_files = new List<string>(){ image_1, image_2 };

            // döngü ile art arda görselleri hashliyoruz
            for (int i = 0; i<= images_files.Count - 1; i++){
                try{
                    string file_path = images_files[i];
                    byte[] buffer;
                    int bytes_read;
                    long size;
                    long total_bytes_read = 0;

                    using (Stream file = File.OpenRead(file_path)){
                        size = file.Length;
                        // SHA 384 kullandığımız için aynı Hash değeri gelmesi neredeyse imkansızdır.
                        using (HashAlgorithm hasher = SHA384.Create()){
                            do{
                                buffer = new byte[8192]; // 8KB aralıklarla belleğe toplu olarak yazacak
                                bytes_read = file.Read(buffer, 0, buffer.Length);
                                total_bytes_read += bytes_read;
                                hasher.TransformBlock(buffer, 0, bytes_read, null, 0);
                                backgroundWorker1.ReportProgress((int)((double)total_bytes_read / size * 100));
                            }while (bytes_read != 0);
                            hasher.TransformFinalBlock(buffer, 0, 0);
                            hash_values.Add(HashStringRotate(hasher.Hash));
                        }
                    }
                }catch (Exception){ }
            }

BackgroundWorker ProgressChanged olayına bu kodları giriyoruz;

C#:
Text = "%" + e.ProgressPercentage;

BackgroundWorker ProgressComplated olayına bu kodları giriyoruz;

C#:
if (hash_values[0] == hash_values[1]){
    label1.Text = "Değerler eşleşiyor";
}else{
    label1.Text = "Değerler eşleşmiyor";
}
// Hash sonuçlarını temizliyoruz
hash_values.Clear();
// başlığı işlem bitince eski haline getirme
Text = Application.ProductName;

Hash değerini okunabilir hale getirmek için Byte işleme Void'i yapıyoruz;

C#:
private static string HashStringRotate(byte[] hash_bytes){
    StringBuilder hash = new StringBuilder(32);
foreach (byte be in hash_bytes){
    hash.Append(be.ToString("X2").ToUpper());
    }
    return hash.ToString();
}

Karşılaştırma isimli butona şu kodları giriyoruz;

C#:
if (image_1 != "" || image_1 != string.Empty && image_2 != "" || image_2 != string.Empty){
    backgroundWorker1.RunWorkerAsync();
}else{
    MessageBox.Show("Görselleri seçiniz.");
}

Şimdi test etme zamanı;

Farklı görseller;


Eki Görüntüle 1768218

Aynı görseller;

Eki Görüntüle 1768219

Aynı olup boyutu farklı görseller;

Eki Görüntüle 1768220

Gördülüğü gibi, aynı görsel dahi olsa 1 Byte bile içeriği değişse eşleşmiyor der.
İşinize yaradıysa ne mutlu.

İyi çalışmalar, iyi Sosyal'ler
😎

İşine yarayacağını düşündüğüm kişiler;
@Vavien. @The Shorekeeper @Emir M. @Astiva @walter wick @Pembiş Gitar @TheAny
Uygulamayı da paylaşabilir misin? VirusTotal linki ile.
 
Son düzenleyen: Moderatör:

Bu konuyu görüntüleyen kullanıcılar

Technopat Haberler

Yeni konular

Geri
Yukarı