Bmp Resmi Gri Resime Dönüştürme (VC#)

3. sınıf bahar yarı yılı seçmeli derslerinden görüntü işleme dersini seçip başıma bela aldım :) ilk dersen hocamız Bmp formatındaki resmi Gri resme dönüştürmeyle ilgili bir uygulama örneği gösterdi (Borland C++’da kodlanmış). Bizden de aynı işe yarayan program yazmamızı istedi. Ben de C#’ta yazmaya karar verdim, ilk defa C#ta program yazmış olmanın mutluluğu var içimde 😀

Neyse konumuza dönelim, Bmp resim formatının yapısı gereği ilk 554 byte’ı resmin tarih, isim, oluşturulma zamanı vs gibi bilgilerinin tutulduğu kısmıdır. Sonra gelen byte’lar ise her pikselin RGB (Red Gray Blue) değerlerini içermektedir. Şöyle ki:
byteDizisi[555] = 1. pixel’in Red değeri
byteDizisi[556] = 1. pixel’in Gray değeri
byteDizisi[557] = 1. pixel’in Blue değeri
byteDizisi[558] = 2. pixel’in Red değeri…

Resmi gri hale çevirebilmek içinse her pixel için bu RGB değerlerin ortalama değerini almak gerekir. Bu durumda resim Gri hale gelecektir.

İlk olarak Tasarım ekranına bakalım:
visual c sharp tasarım ekranı
Tasarım olarak 1 adet buton, 2 adet pictureBox ve 1 adet openFileDialog (name’i dosyaAc olarak değiştirilmiş) kullandım.
Buton’a çift tıklayıp kod ekranına geçiyoruz:

  dosyaAc.Title = "Resim Seç";
            dosyaAc.InitialDirectory = System.Environment
            .GetFolderPath(Environment.SpecialFolder.Desktop); 
//masa üstünden resim alacak şekilde ayarlandı
            dosyaAc.FileName = ""; 
//seçilecek dosya ismi boş bırakıldı
            dosyaAc.Filter = "Bitmap|*.bmp"; 
// seçilecek dosya türü bmp olarak ayarlandı
            dosyaAc.ShowDialog(); 
// seçme penceresi açıldı
            Secilen_Dosya = dosyaAc.FileName; 
// seçilen resim Secilen_Dosya değişkenine atandı
            pictureBox1.Image = Image.FromFile(Secilen_Dosya); 
//soldaki pictureBox'ta resim gösterildi.

            byte[] resimByteDizisi = new byte[0]; 
//resmin byte dizisini alacak değişken tanımlandı
            resimByteDizisi = resmiByteArrayeDonustur(pictureBox1.Image); 
//resmi byte dizisine dönüştürecek fonksiyonla alınan resim çağrıldı
           //RGB değerlerini hesaplama bölümü
            int temp; 
            for (int i = 554; i < resimByteDizisi.Length - 2; i += 3)
//RGB değerleri için i değişkeni 3'er artıyor ve 554'ten başlıyor.
            {
                temp = ((int)resimByteDizisi[i] + 
 //resmin R değeri int'e dönüştürüldü
                    (int)resimByteDizisi[i + 1] + 
 // resmin G değeri int'e dönüştürüldü
                    (int)resimByteDizisi[i + 2]) / 3; 
// resmin B değeri int'e dönüştürüldü ve RGB'nin ortalaması alındı
                resimByteDizisi[i] = (byte)temp; 
//daha sonra RGB değerleri
                resimByteDizisi[i + 1] = (byte)temp; 
//yerine o pixelin
                resimByteDizisi[i + 2] = (byte)temp;
 // gri değeri konuldu

            }

           
TypeConverter griyeDonustur = TypeDescriptor.GetConverter(typeof(Bitmap));
 // byte array'den griye 
            Bitmap griResim = (Bitmap)griyeDonustur.ConvertFrom(resimByteDizisi);
 // resim dönüştürüldü
            pictureBox2.Image = griResim; 
// gri resim sağdaki pictureBox'ta gösterildi

        }
      // Resmi byte array'a dönüştüren fonksiyon
        public byte[] resmiByteArrayeDonustur(System.Drawing.Image resim)
        {
            MemoryStream ms = new MemoryStream();
            resim.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            return ms.ToArray();
        }
// Memory Stream kütüphanesi yardımıyla Bmp formatındaki 
resim byte array'e dönüştürüldü
     

Vee sonuç:
programın çıktısı
C# ile yazılmış bu projeyi indirmek için tıklayınız.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir