Twitter kullananlar, resim henüz yüklenme aşamasındayken resim arka planının sabit bir renk olmadığını, resimdeki baskın renge göre değiştiğini fark etmişlerdir.
Dijital görüntü piksellerden oluşur. Her bir piksel RGB denilen bir kodlama ile renklendirilir.
RGB Nedir?
RGB; red, green ve blue kelimelerinin baş harflerinden oluşan bir kısaltmadır. Şu anda, ekranda gördüğünüz her şey piksellerden oluşur ve her bir piksel kırmızı, yeşil ve mavi renkli ışıkların belli oranda kullanılarak elde edilmesiyle oluşmaktadır.
Resimdeki baskın rengi bulan programın ekran görüntüsü, örnekleriyle birlikte aşağıdaki şekildedir:
OpenFileDialog ile Dosya Seçimi
Dosya seçimi için açılan pencere, C# form uygulamasında OpenFileDialog ile sağlanır. Bunun için form içine eklenen openFileDialog1 nesnesi kullanılmıştır. Dosya seçim penceresini göstermek için aşağıdaki komut yazılır:
1 | openFileDialog1.ShowDialog(); |
Seçilen dosya veya dosyalar, openFileDialog1 nesnesinin FileName özelliği ile elde edili: openFileDialog1.FileName
Eğer birden dosya seçilir ve bunların hepsinin elde edilmesi gerekiyorsa, string tipinde bir dizi döndüren şu özellik kullanılır: openFilaDialog1.FileNames
PictureBox nesnesine tıklandığında dosya seçimi yapılmasını sağlayan kod bloğu şu şekildedir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private void pictureBox1_Click(object sender, EventArgs e) { openFileDialog1.ShowDialog(); pictureBox1.Image = Image.FromFile(openFileDialog1.FileName); try { this.BackColor = Color.FromArgb(baskinRengiBul()); } catch { MessageBox.Show("Saydam renk uygulanamıyor."); } } |
Resimdeki Pikselin Renk Bilgisi Okuma
Resimdeki bir pikselin renk bilgisinin okunması için öncelikle bir Bitmap nesnesi üzerine resmin aktarılması gerekir. pictureBox1 nesnesi üzerinde gösterilen resmin oluşturulan Bitmap nesnesine aktarılması için aşağıdaki komut yazılır:
1 | Bitmap resim = (Bitmap)pictureBox1.Image; |
Resim üzerindeki satır (x) ve sütun (y) konumundaki renk bilgi de aşağıdaki şekilde elde edilir:
1 | int pikseldekiRenk = resim.GetPixel(x, y).ToArgb() |
Yukarıdaki komut ile pikselin renk bilgisi integer tipte bir sayı olarak saklanır. ToArgb() metodu, pikselin kırmızı, yeşil ve mavi bilgilerinin dışında saydamlık bilgisinin elde edilmesinde de kullanılır. Bu bilgiler, integer tipte bir sonuç ile karşımıza getirir.
Renk Bilgileri ile Piksel Sayılarının Kaydedilmesi
Renk bilgisi, Dictionary tipinde bir nesne ile saklanır. Bu nesne, anahtar-değer (key-value) ikilisi şeklinde bilgi taşır. Dikkat edilmesi gereken noktanın anahtar değerlerini yalnızca bir kez içermesidir. Dolayısıyla bir renk bilgisi ile ilk karşılaşıldığında renk isimli Dictionary nesnesine kayıt eklenirken aynı renk ile karşılaşıldığında değer bir artırılır.
1 | Dictionary<int, int> renk = new Dictionary<int, int>(); |
En Yüksek Sayıda Karşılaşılan Renk Değerinin Elde Edilmesi
renk nesnesi üzerinde, değerlere göre azalan şekilde sıralama yapılması gereklidir. Bunun için LINQ ifadesi işimizi oldukça kolaylaştıracaktır.
1 2 | int baskinRenk = renk.OrderByDescending(x => x.Value).ToDictionary(x=>x.Key,x=>x.Value).First().Key; |
Sonuç olarak resimdeki baskın, diğer bir deyişle dominant rengi elde eden programın kaynak kodları aşağıdaki şekilde olmaktadır:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Resimdeki_Baskın_Renk { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void pictureBox1_Click(object sender, EventArgs e) { openFileDialog1.ShowDialog(); pictureBox1.Image = Image.FromFile(openFileDialog1.FileName); try { this.BackColor = Color.FromArgb(baskinRengiBul()); } catch { MessageBox.Show("Saydam renk uygulanamıyor."); } } Dictionary<int, int> renk = new Dictionary<int, int>(); private int baskinRengiBul() { renk.Clear(); Bitmap resim = (Bitmap)pictureBox1.Image; for (int x=0;x<resim.Width;x++) { 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); } } } int baskinRenk = renk.OrderByDescending(x => x.Value).ToDictionary(x=>x.Key,x=>x.Value).First().Key; return baskinRenk; } } } |