Hızlı Konu Açma

Hızlı Konu Açmak için tıklayınız.

Son Mesajlar

Konulardaki Son Mesajlar

Reklam

Forumda Reklam Vermek İçin Bize Ulaşın

C# ile Resim İşlemeye Kısa Bir Bakış

YaSa22

Fahri Üye
Fahri Üye
Katılım
12 Temmuz 2014
Mesajlar
2,293
Tepkime puanı
2
Puanları
0
Konum
GTA
Resim ve görüntü hayatımızın her alanında her an gerçek günlük yaşantımızda veya sanal ortamlarda rastladığımız ve çağımızda dijital fotoğraf makinesi vb. cihazlarla yanımızda taşıdığımız bir olgu haline geldi. Ülkemizde satışlarında gerçekten bir patlama yapan dijital fotoğraf makinelerine ilişkin resim işleme kavrama temelleri ve aynı zamanda inanılmaz bir hızla gelişen görüntü tanıma yazılımların kullanım temelleri üzerinde ciddi bir biçimde durmak istiyorum. Ülkemizde üniversitelerin gerçekten üstünde durduğu bir kavramdan bahsediyoruz resim işleme( Çoğunlukla görüntü işleme diye anılır). Oyun stüdyolarının ve Holywood’un bir kare için bile harcadığı zaman ve makine gücünü temel alırsak günümüzde bu kadar öneme sahip olan temel resim işlemlerini irdelememiz kaçınılmaz oluyor. İlk önce piksel ne demek bunu açıklama gereksinimi duyuyorum:

Bir görüntünün en küçük yapıtaşıdır. 1*1 mm olacağı gibi, 5*5cm veya 10*10cm de olabilir genel bir standardı yoktur. Piksel herhangi bir ölçüte sahip olmadığı gibi birden çok pikselden meydana gelen topluluğa ise resim adını veriyoruz ( Biraz Lise ders kitaplarından fırlamİ bir cümleye benzese de bu tanımı belleğimize kazımak zorundayız). Yapacağımız işlemlerde GDI+ kullanılmıştır. Bu makalemizde ise dijital resim işleminin temeli olan RGB meselesine değineceğim. Bildiğiniz gibi:

R: Red (Kırmızı)
G: Green (Yeşil)
B: Blue (Mavi)

Dijital Resimler bu 3 renkten oluşur.

Ardından Form1 sınıfımızın kodlarına şunları ekleyelim:

Bitmap resim;

Forma çift tıklayıp şu kodu yazalım:

isle.Enabled = false;

Eminim daha öncede aşina olduğunuz enabled özelliğini kapattık. İlk yapacağımız iş tahmin ettiğiniz gibi resim aç butonuna tıklamak olacaktır ve ardından bu butonun kodunu yazalım tabi ki de resim işleme ile tam olarak ilgisi olmasa da yinede can alıcı bir kod çünkü resmimizi Picture box’ımıza bu buton sayesinde yerleştiriyoruz. Resim Aç butonumuzun kodu:

isle.Enabled = true;
resimac.Enabled = false;
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = "c:\\";
openFileDialog.Filter = "Bitmap Dosyaları (*.bmp)|*.bmp|Jpeg Dosyaları (*.jpg)|*.jpg";
openFileDialog.FilterIndex = 2;
openFileDialog.RestoreDirectory = true;
if (DialogResult.OK == openFileDialog.ShowDialog())
{
resim = (Bitmap)Bitmap .FromFile(openFileDialog.FileName, false);
}

Burada standart bir kodlamayla resmimizi Bitmap sınıfından resim isimli nesnemizi seçtiğimiz dosyanın path’i(yani yolu) ile canlandırıyoruz. Bu kodun üstünde fazla durmayacağım.
isle isimli butonumuzun koduna gelecek olursak:

resimac.Enabled = true;
isle.Enabled = false;
try
{
int x, y;
for (x = 0; x < resim.Width; x++)
{
for (y = 0; y < resim.Height; y++)
{
Color pixelColor = resim.GetPixel(x, y);
Color newColor=Color.FromArgb(pixelColor.R,pixelColor.G,pixelColor.B);
if(checkBox1.Checked==true && checkBox2.Checked==true && checkBox3.Checked==true)
newColor = Color.FromArgb(pixelColor.R, pixelColor.G, pixelColor.B);
else if (checkBox1.Checked == true && checkBox2.Checked == true && checkBox3.Checked == false)
newColor = Color.FromArgb(pixelColor.R, pixelColor.G, 0);
else if (checkBox2.Checked == true && checkBox3.Checked == true && checkBox1.Checked == false)
newColor = Color.FromArgb(0, pixelColor.G, pixelColor.B);
else if (checkBox3.Checked == true && checkBox1.Checked == true && checkBox2.Checked == false)
newColor = Color.FromArgb(pixelColor.R, 0, pixelColor.B);
else if (checkBox1.Checked == true)
newColor = Color.FromArgb(pixelColor.R, 0, 0);
else if (checkBox2.Checked == true)
newColor = Color.FromArgb(0, pixelColor.G, 0);
else if (checkBox3.Checked == true)
newColor = Color.FromArgb(0, 0, pixelColor.B);
resim.SetPixel(x, y, newColor);
}
}
// Görüntümüz pictureboxda gösteriliyor
PictureBox1.Image = resim;

// Piksel Formatları label1 de gösteriliyor
label1.Text = resim.PixelFormat.ToString();
}
catch
{
MessageBox.Show("Hata");
}

İlk öncelikle try-catch bloğumuz dikkatinizi çekmiş olmalı kod bloğumuzda bir sorun çıkarsa Hata mesajı bırakacak. x ve y adlı iki alanımız for döngümüzde piksellerimizi taramak için kullanacağız. Ardından resmin en ve boy yüksekliğini ele alıp her piksele ulaşıyoruz ve for döngümüzü buna göre çalıştırıyoruz. GetPixel() metodumuzla o anki piksel değerlerini Color sınıfından pixelColor adlı nesnemize atıyoruz. Ardından yine Color sınıfından newColor isimli bir nesne atayıp Color sınıfı üstünden statik olan FromArgb metodumuzu çalıştırıp aldığı 3 parametreye göre çeşitli atraksiyonlar yapıyoruz. Checkboxlarımızın durumuna göre basit bir if-else mantığı içinde (RGB değerlerinin En iyi anlatımının if-else mantığı içinde gözler önüne serilebileceği kanısındayım) newColorımızı canlandırıyoruz. İlk canlanmada piksel değerleri değişmediği için hiçbir checkbox’a basılmamışsa resim orijinal değerlerini koruyacaktır aynı etkiyi RGB checkboxlarının üçünü birden seçtiğinizde de görebilirsiniz. Ardından değiştirdiğimiz pikseli SetPixel()metodu ile resmimizi piksel piksel değiştiriyor ve ardından piksellerimizi picturebox’ımıza yerleştiriyoruz. resim.PixelFormat.ToString() kodunda ise label’ımıza pikselimizin formatını atayabiliyoruz.



orjinal resim



red Seçilmiş



green seçilmiş



blue seçilmiş



red ve green seçilmiş



green ve blue seçilmiş



red ve blue seçilmiş

Son Olarak piksellere ulaşmamızın mantığını görmek için isle butonumuzun kodundaki x ve y alanlarımızı sırayla ilk önce for döngüsünün artım miktarında x+=3 ve y+=3 yapıp sırasıyla deneyelim ve böylece resmimize değişik efektler vermiş olabiliriz.

for (x = 0; x < resim.Width; x+=2)
{
for (y = 0; y < resim.Height; y+=2)
{

Bu değişimin getirdiği efekti size bırakıyorum. Son olarak bir buton ekleyelim ve resmimizi kaydetmek için bu butonumuzu kodlayalım. Kodumuz:

resim.Save("C:\\cikti.jpg");
MessageBox.Show("Resim Kaydedildi!");

Bu kodumuzda görüntümüzü C:\ yoluna cikti.jpg ismiyle kaydediyoruz. Resim işlemenin daha doğrusu görüntü işlemenin temelini yani piksel ve RGB üstünde durduk umarım sizin için faydalı olmuştur. Sorularınızı ve yorumlarını bana email yoluyla iletebilirsiniz.
 

Users Who Are Viewing This Konu (Users: 0, Guests: 1)

Üst