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 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;
Gerekli kitaplıklar;
Global alana 2 adet değişken ve 1 adet List ekliyoruz;
Şimdi 1.resim isimli butona şu kodları giriyoruz;
Şimdi 2.resim isimli butona şu kodları giriyoruz;
BackgroundWorker BG_Worker olayını bu kodları giriyoruz;
BackgroundWorker ProgressChanged olayına bu kodları giriyoruz;
BackgroundWorker ProgressComplated olayına bu kodları giriyoruz;
Hash değerini okunabilir hale getirmek için Byte işleme Void'i yapıyoruz;
Karşılaştırma isimli butona şu kodları giriyoruz;
Şimdi test etme zamanı;
Farklı görseller;
Aynı görseller;
Aynı olup boyutu farklı görseller;
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
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
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
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;
Aynı görseller;
Aynı olup boyutu farklı görseller;
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
