Merhaba, C# Resmin Renk Yoğunluklarını Bulma dersi ile C# eğitim setime devam ediyorum. Bu dersimizde C# kullanarak bir picturebox’a aldığımız resimdeki renk yoğunluklarını bulan bir proje yapacağız. Seçilen resimdeki 10 farklı renk yoğunluğunu alıp bir panele renk ataması yapacağız ve bir textbox nesnesine de rengin Agrb kodunu yazacağız.
C# Resmin Renk Yoğunluklarını Bulma
Bu proje için formumuza bir picturebox nesnesi, bir progressbar nesnesi, 10 panel ve 10 textbox nesnesi ekleyeceğiz. Textbox nesneleri panellerin içerisinde olacak. Form tasarımımız şu şekilde.
Şimdi kodlarımızı verelim.
Picturebox Click eventine geliyoruz ve bir OpenFileDialog açıyoruz.
private void pictureBox1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); if (openFileDialog1.ShowDialog() == DialogResult.OK) try { pictureBox1.Image = Image.FromFile(openFileDialog1.FileName); Application.DoEvents(); baskinRengiBul(); } catch (OutOfMemoryException) { MessageBox.Show("Bu resim incelenemiyor"); } }
Buradaki Application.DoEvents() kodu, metoda başlamadan önce resmi picturebox nesnesine ekleyecek. Eğer burada bu kodu kullanmazsak, metottaki kodların çalıştırılması bitene kadar resim görünmez. Bazı resimlerde OutOfMemoryException yani “Bellek yetersiz” hatası aldığımız için burada bir try catch kullanıyoruz.
Şimdi bize lazım olan değişkenleri tanımlayalım. Seçilen resimdeki en çok kullanılan 10 rengi alacağız.
int baskinRenk0, baskinRenk1, baskinRenk2, baskinRenk3, baskinRenk4, baskinRenk5, baskinRenk6, baskinRenk7, baskinRenk8, baskinRenk9; Dictionary<int, int> renk = new Dictionary<int, int>();
Burada Dictionary kullanımı hakkında bir ders yazmadığımı fark ettim. Bu sebeple bu konu hakkında da bir ders gelir yakın zamanda.
Şimdi baskinRengiBul() metodumuzun kodlarını görelim.
private void baskinRengiBul() { renk.Clear(); progressBar1.Value = 0; Bitmap resim = (Bitmap)pictureBox1.Image; progressBar1.Maximum = resim.Width; for (int x = 0; x < resim.Width; x++) { try { progressBar1.Value++; Application.DoEvents(); } catch (ArgumentOutOfRangeException) { progressBar1.Maximum = resim.Width + 10; } for (int y = 0; y < resim.Height; y++) { //Saydam alanlar hesaplanmıyor if (resim.GetPixel(x, y).A != 0) { int pikseldekiRenk = resim.GetPixel(x, y).ToArgb(); if (renk.ContainsKey(pikseldekiRenk)) renk[pikseldekiRenk]++; else renk.Add(pikseldekiRenk, 1); } } } renk.Remove(-1); var sortedDict = (from entry in renk orderby entry.Value descending select entry) .ToDictionary(pair => pair.Key, pair => pair.Value).Take(10); baskinRenk0 = sortedDict.ElementAt(0).Key; panel0.BackColor = Color.FromArgb(baskinRenk0); textBox0.Text = panel0.BackColor.ToString(); baskinRenk1 = sortedDict.ElementAt(1).Key; panel1.BackColor = Color.FromArgb(baskinRenk1); textBox1.Text = panel1.BackColor.ToString(); baskinRenk2 = sortedDict.ElementAt(2).Key; panel2.BackColor = Color.FromArgb(baskinRenk2); textBox2.Text = panel2.BackColor.ToString(); baskinRenk3 = sortedDict.ElementAt(3).Key; panel3.BackColor = Color.FromArgb(baskinRenk3); textBox3.Text = panel3.BackColor.ToString(); baskinRenk4 = sortedDict.ElementAt(4).Key; panel4.BackColor = Color.FromArgb(baskinRenk4); textBox4.Text = panel4.BackColor.ToString(); baskinRenk5 = sortedDict.ElementAt(5).Key; panel5.BackColor = Color.FromArgb(baskinRenk5); textBox5.Text = panel5.BackColor.ToString(); baskinRenk6 = sortedDict.ElementAt(6).Key; panel6.BackColor = Color.FromArgb(baskinRenk6); textBox6.Text = panel6.BackColor.ToString(); baskinRenk7 = sortedDict.ElementAt(7).Key; panel7.BackColor = Color.FromArgb(baskinRenk7); textBox7.Text = panel7.BackColor.ToString(); baskinRenk8 = sortedDict.ElementAt(8).Key; panel8.BackColor = Color.FromArgb(baskinRenk8); textBox8.Text = panel8.BackColor.ToString(); baskinRenk9 = sortedDict.ElementAt(9).Key; panel9.BackColor = Color.FromArgb(baskinRenk9); textBox9.Text = panel9.BackColor.ToString(); progressBar1.Value = progressBar1.Maximum; Application.DoEvents(); }
Kodları açıklamak gerekirse;
- Renk Dictionary’i temizledik.
- ProgressBar ‘ın value özelliği sıfırladık.
- Picturebox’taki resmi bir Bitmap değişkenine aldık.
- ProgressBar ‘ın maximim özelliğine resmin genişliğini verdik.
- Resmi pixel pixel tarayacağımız için iç içe for döngüsü kullanacağız.
- Burada progressbar bazı resimlerde hata verdiği için, eğer hata verirse başta ayarladığımız maximum değeri 10 arttırmasını istedik.
- ikinci for döngüsüne geçtiğimizde, resmin piksellerini Dictionary içerisine alıyoruz. Burada rengin Agrb kodunu ve o Argb kodunun kaç kere geçtiğini sayıyoruz.
- Döngüler sonlandığında renk Dictionary içindeki -1 kodunu siliyoruz. Sebebini tam olarak bilmemekle beraber her resimde en çok geçen renk kodu oluyor o yüzden onu siliyoruz. Siz bu kod satırını silip ne demek istediğimi görebilirsiniz.
- İstemediğimiz renk kodunu sildikten sonra, Dictionary içindeki en çok kullanılan 10 renk kodunu alıyoruz.
- Geri kalan kısımda ilgili panel ve textbox nesnelerine renk kodlarının atamasını yapıyoruz.
- Burada ElementAt komutunu kullanarak Dictionary içindeki renk kodlarını index numaralarına göre alıyoruz.
- Eğer progressbar da bir hata alırsak ve eksik kalırsa tamamlanmasını istiyoruz.
NOT: Application.DoEvent() kodunu, hızın çok önemli olmadığı noktalarda kullanmanızı tavsiye ederim. Çünkü kodları ekrana basma için de uğraştığından kodların çalışma hızını yavaşlatacaktır.
Çalışan halinin ekran görüntüsü;
Bazı resimlerde bulunan renklere “Ne alaka yaa!” diyebilirsiniz ama programın gösterdiği renk scalası aslında doğrudur. Çünkü en ufak bir renk tonu oynamasında farklı bir renk olarak görülüyor. Bu sebeple resim yarısı yeşillik yarısı gökyüzü olsa bile (örn xp wallpaper) ilk onda tek bir yeşil tonu bile olmuyor. Çünkü o yeşillerin renk tonlarında çok farklılıklar var.
C# Resmin Renk Yoğunluklarını Bulma yazımda bu kadar arkadaşlar.
Bana destek olmak isterseniz, iletişim sayfamda verdiğim sosyal medya hesaplarımı takip edebilirsiniz.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bu bağlantıdan ulaşabilirsiniz… Bu projeyi Drive’a yükledim. Bu bağlantıya tıklayarak indirebilirsiniz.
Bu yazı, sitemdeki 435. yazıdır…
Sağlıcakla ve takipte kalın. ;)