Post Page Advertisement [Top]

         Bu yazımda görüntü işlmemenin temlelerinden olan daha çok pixel elde edip işlemeye dayalı uygulamalardan bahsedeceğim,bu uygulamada resmin negatifini alma,emboss efekti,resmi griye dönüştürme gibi işlemlerin yanı sıra programın ikinci tabında goruntunun RGB değerlerine ayrışması işlemi var uygulamayı ilerleyen zamanlarda geliştirerek efekti geri al resmi kaydet iyleştirmesi,ve daha farklı efektlerde eklemeyi düşünüyorum bu uygulamamnın kodununu bu siteden faydalanarak oluşturdum. http://www.csharpnedir.com/articles/read/?id=657&title=C sizde de bakabilirsiniz oldukça guzel anlatımlar yer alıyor. Şimdilik uygulama gorunumum aşagıdaki gibidir.
    Oncelikle C# platformumda oluşturdugum form üzerine bir tabbed panel oluşturudm.1 sekmeden başlayabiliriz.( Resim Efektleri sekmesi).


Bu sekmede iki tane picturebox 4 tanede butona ihtiyacımız olacak,birde resim açmak için openfiledialog eklememiz gerekiyor.Resim açma işlemi ile başlayabiliriz.resim açma butonu sonraki sekmedede aynı kodu kullancaktır.oluşturduğumuz resim aç butonuna tıkalyıp aşagıdaki kodu kullanabilirz.


openFileDialog1.Filter = "Resim Dosyaları|" + "*.bmp;*.jpg;*.gif;*.wmf;*.tif;*.png";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox2.Image = null;
                pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);
            }

Ayrıca bu projede resme efekt işlemi uygulanırken kullanıcıya gorsel açıdan daha iyi bir aktarım yapmak için progress bar da mevcut.bu tolu toolboxdan bulabilirsiniz.Her 10 satırda bir progres bar max ve öin değerler arasında olmak uzere guncellenir.

if ((i % 10) == 0)//her on satırda bir göstergeyi güncelle
                        {
                            progressBar1.Value = i * bmp.Height + j;
                            Application.DoEvents();
                        }
 
Efektlerden kısaca bahsedecek olursam resmin ki bu koda da Picturebox dan 1 sekmede bmp adlı resim değişkenine ,2 sekme de ise resim değişkenine atanarak uzerinde işlemler yapılır.resim dosyasının negatifini alma işlemi temel olarak suna dayanır.

r = bmp.GetPixel(i, j);//i,j noktasının rengini öğren
                        //alfa kanalı hariç diğer kanalların tersini al
                        r = Color.FromArgb(r.A, (byte)~r.R, (byte)~r.G, (byte)~r.B);

i,j noktasının öğrenilmesinde resim bir matris gibi düşünülerek width ve height boyunca taranır ve istenen işlem uygulanır.
Emboss efekti:

renk1 = bmp.GetPixel(i, j);//i,j noktasının rengini öğren
                        renk2 = bmp.GetPixel(i + 1, j + 1);//sonraki noktanın rengini öğren
                        r = Math.Abs((int)(renk1.R) - renk2.R) + 128;
                        if (r > 255)
                            r = 255;
                        g = Math.Abs((int)(renk1.G) - renk2.G) + 128;
                        if (g > 255)
                            g = 255;
                        b = Math.Abs((int)(renk1.B) - renk2.B) + 128;
                        if (b > 255)
                            b = 255;
                        renk3 = Color.FromArgb(r, g, b);
                        bmp.SetPixel(i, j, renk3);

 noktalar ikişer ikişer alınıp değerlendirildiğinden for dongusu de bu efektte -2 ile sonlanır,uygulamanın kodlarını indirip inceleyebileceginiz için deteylıca anlatmıyorum.
Gri format için ise rgb değerleri üçe bolunerek ortalama alınır.

renk = bmp.GetPixel(i, j);
                        renk = Color.FromArgb((byte)((renk.R + renk.G + renk.B) / 3), (byte)((renk.R + renk.G + renk.B) / 3), (byte)((renk.R + renk.G + renk.B) / 3));

Gelelim resmi rgb değerleri içeren formatlarına dönüştürme işlemine bu işlem else if yapısı ile gerçekten çok daha esnek oluyor.check boxdan istediğiniz red gren blue değerini teker teker de ikişer olarakda resme uygulaya biliyorsunuz
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);



Resim kaydet kısmında suan için bir eksiklik var resmi .bmp .jpeg vb formatlarda deil de bir dosya turu olarak algılayıp kaydediyor.uygulamanın tamamıyla ilgili inceleyip geliştiren arkadaşlarım olursa sevinirim çünkü goruntu işleme oldukça geniş bir yelpazeye sahip ve oldukça geliştirilebilir bir alan.
Uygulama kodlarını buradan indirebilrsiniz.

 

 
 

 

Hiç yorum yok:

Yorum Gönder

Bottom Ad [Post Page]