11 Nisan 2012 Çarşamba

C#'da Resmi Siyah Beyaz Yapma

Merhaba arkadaşlar başlıktanda anlaşılacağı gibi bir resmi siyah beyaz nasıl yaparız bunu görücez.Burda yapıcağımız işlemi pek profesyonel olarak adlandıramam Photoshop vb. tarzda hızlıda olmuycak ama en iyi şekilde bize sonuç döndürücek diyebilirim.İşlem nasıl olucak derseniz yüklüyeceğimiz resmi pixel pixel alıp üstünde işlem yapıp sonra yeni bir resim eklemek şeklinde izah edebilirim.Bilgisayarda renk sistemi  RGB 'dir arkadaşlar ve bu sistem üzerinden renklerle oynuycaz.Nedir bu RGB derseniz arkadaşlar R - kırmızı G - yeşik ve B de mavi renkleri temsil eder.Bilgisayarda ekranımıza gelen her pixel de bu renklerin karşımından oluşmuş yeni bir rengi görürüz.Her pixel içinde RGB değeri vardır ve başta da söylediğim gibi tek tek bu pixeller üzerinde oynama yapıcaz.Gri tonlama içinsede RGB değerlerinin toplamının ortalamasını alıcaz ve yeni RGB değeri olarak aktarırız.Kodlar içinde programın can alıcı kısımlarını sizlere anlatıcam arkadaşlar böylece daha anlaşılır olucağını düşünüyorum arkadaşlar.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BitmapSınıfı
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string DosyaYolu = "";
        Bitmap bmp = null;
        private void button1_Click(object sender, EventArgs e)
        {
            if (opf.ShowDialog() == DialogResult.OK)
            {
                DosyaYolu = opf.FileName;
                bmp = new Bitmap(DosyaYolu);
                pcb.Image = bmp;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker1.IsBusy)
            {
                backgroundWorker1.RunWorkerAsync("SB");
            }
            toolStripProgressBar1.Visible = true;
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            switch (e.Argument.ToString())
            {
                case "SB": SiyahBeyazYap(); break;
                case "KK": KirmiziYap(); break;
                default:
                    break;
            }
        }

        private void SiyahBeyazYap()
        {
            //Buradaki İç içe 2 For döngümüz resim üzerinde pixel pixel gezmemizi sağlar
            for (int y = 0; y < bmp.Height; y++)
            {
                for (int x = 0; x < bmp.Width; x++)
                {
                    Color eski = bmp.GetPixel(x, y);//X ve Y Koordinatlarındaki Pixel'i Alır.Bu değeri Color tipinde bir değişkene atar.
                    int ortalama = (eski.R + eski.G + eski.B) / 3; //Color tipindeki değerin RGB'si ve bunların değerleri vardır bunların ortalaması alınır.
                    Color yeni = Color.FromArgb(ortalama, ortalama, ortalama);//Aldığımız ortalama değeri yeni bir renk oluşturmak için Color tipinde bir değişkene aktarırız.
                    bmp.SetPixel(x, y, yeni);//son olarakda önceden değerini aldığımız X ve Y koordinatlarındaki Pixeli Geri yükleriz.
                }
            }
            pcb.Image = bmp;//tüm işlemler bittikten sonrada PictureBox nesmize yeni resmimizi aktarırız.
        }

        private void KirmiziYap()
        {

            for (int y = 0; y < bmp.Height; y++)
            {
                for (int x = 0; x < bmp.Width; x++)
                {
                    Color eski = bmp.GetPixel(x, y);//renk değerlerinin ortalamasını alırsan gri tonu oluşur.
                    int ortalama = (eski.R + eski.G + eski.B) / 3;
                    Color yeni = Color.FromArgb(eski.A, 255, ortalama, ortalama);
                    bmp.SetPixel(x, y, yeni);
                }
            }
            pcb.Image = bmp;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            toolStripProgressBar1.Visible = false;
        }

        private void Kırmızımsı_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker1.IsBusy)
            {
                backgroundWorker1.RunWorkerAsync("KK");
            }
            toolStripProgressBar1.Visible = true;
        }
    }
}


Program ile iglili Video :


Umarım işinize yarar arkadaşlar.Okuduğunuz için teşekkürler.

2 yorum:

  1. form kısmına hangi nesneleri eklememiz gerekiyor ? teşekkürler şimdiden

    YanıtlaSil
    Yanıtlar
    1. Merhaba , yazıyı yazalı çok uzun zaman oldu, o yüzden kaynağı elimde bulunmuyor. Algoritması üzerinde durursanız istediğiniz kodları içerisinden alabilirsiniz.

      Sil