Windows Mobile ile Görüntü İşleme

 
Mobil cihazlar özellikle Windows Mobile kullanan cihazlar hayatımıza girdiğinden beri sıradan masaüstü ve dizüstü bilgisayarla yaptığımız işlemlerin hepsini bu cihazlarlada yapabilir seviyeye geldik. İşlemci güçleri ve depolama kapasiteleri arttığı için artık ben PDA=Desktop=Laptop denklemini her alanda söylemeye başladım. Bazı cihazlarda resimleri işlemek için gerekli olan yazılım gömülü gelmekte fakat PDA’lerin bazı versiyonlarında yok veya tam donanımlı bir image işleme yazılımı bulunmamakta. Bulunsa dahi çoğu teknoloji için durağan bir görüntü işlemek yazılım geliştirici kişi tarafından bir ihtiyaç halini almaktadır. Bu yazımda sizlere durağan görüntü olan image ler ile Windows Mobile cihazın kamerasından veya dışarıdan aldığınız görüntüyü işlemeyi göstermek istemekteyim. Burada asıl zorluk .Net Framework’ün geniş olanaklarından .Net Compact Framework’un kısıtlı olanaklarına geçiş yaptığımızdan ötürü olacaktır.

 

RGB mantığı ve kısmende olsa unsafe kod kullanacağımızı belirtmek isterim. Öncelikle kullanıcı arayüzümüzü oluşturalım;

 

Bu arayüz sayesinde kırmızı,yeşil ve mavi değerlerimizin her tonunu ve birlikte yansıyan her rengi verebilmekteyiz.

Bir pixel’in Red,Green veya Blue değerinin 255 aldığını düşünürsek, toplam bir imaja verebileceğimiz renk sayısı,

255*255*255 olacaktır. Yeni Renk kısmında ise oluşan renkleri görmekteyiz. Formumuzun kodu aşağıdaki şekildedir;

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

    public partial class renkminimize : Form

    {

        Image islenecek;

        menu mn;

        public renkminimize(Image img,menu mnu)

        {

            mn = mnu;

            islenecek = img;

            InitializeComponent();

        }

 

        private void menuItem1_Click(object sender, EventArgs e)

        {

            mn.Show();

            this.Dispose();

        }

        private void deger()

        {

            Color newColor = Color.FromArgb(trackBar1.Value, trackBar2.Value, trackBar3.Value);

            label5.BackColor = newColor;

        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)

        {

            deger();

        }

 

        private void trackBar2_ValueChanged(object sender, EventArgs e)

        {

            deger();

        }

 

        private void trackBar3_ValueChanged(object sender, EventArgs e)

        {

            deger();

        }

 

        private void menuItem2_Click(object sender, EventArgs e)

        {

            Bitmap bmp=new Bitmap(islenecek);

            bool donus = filtercore.ColorChangeMinimize(bmp, trackBar1.Value, trackBar2.Value, trackBar3.Value);

            Image img= bmp;

            menu mnn = new menu(img);          

            mn.Dispose();

            this.Dispose();

            mnn.Show();

        }

}

Trackbar’daki değerlerle Color sınıfını kullanarak yeni rengimizi herhangi bir trackbar değişiminde tutmaktayız.

Bu sayede her renk Color sınıfı sayesinde elimizde olmakta. FilterCore sınıfımız ise aşağıda bu sayede yeni rengi imaja uygulayabilmekteyiz;

 

public class filtercore

{

        public static bool ColorChangeMinimize(Bitmap b, int red, int green, int blue)

        {

            BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);

 

            int stride = bmData.Stride;

            System.IntPtr Scan0 = bmData.Scan0;

 

            unsafe

            {

                byte* p = (byte*)(void*)Scan0;

 

                int nOffset = stride - b.Width * 3;

                int Pixel;

 

                for (int y = 0; y < b.Height; ++y)

                {

                    for (int x = 0; x < b.Width; ++x)

                    {

                        Pixel = p[2] + red;

                        Pixel = Math.Max(Pixel, 0);

 

                        p[2] = (byte)Math.Min(255, Pixel);

 

                        Pixel = p[1] + green;

                        Pixel = Math.Max(Pixel, 0);

 

                        p[1] = (byte)Math.Min(255, Pixel);

 

                        Pixel = p[0] + blue;

                        Pixel = Math.Max(Pixel, 0);

 

                        p[0] = (byte)Math.Min(255, Pixel);

 

                        p += 3;

                    }

                    p += nOffset;

                }

            }

 

            b.UnlockBits(bmData);

 

            return true;

        }

 

}

Bu sınıf sayesinde resmimizi unsafe olarak piksel piksel işleyebilmekteyiz. Her byte’ına ulaştığımız için tüm resimin

kontrolü elimizde.

               Ana menümüzden renkminimize sınıfına ise bir image göndererek çağırmalıyız;

 

                renkminimize rnkd = new renkminimize(this.pictureBox1.Image, this);

                rnkd.Show();

          this.Hide();

 Programımızın çalışmasını ise aşağıdaki ekran görüntülerinden görebilirsiniz. Aşağıdaki değerlerin renk sonucunu realtime renk paletinden görebilirsiniz.

 Uygulaya bastıktan sonra ana menüdeki picturebox'ın içine yeni renkteki imajımız yerleşecektir.

 

 

  Yeni imaj !

 

 Kaynak: imaj işleme sınıfı, codeproject.com

Yorum ekle