msHOWTO

C# gdi anlatımı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
C# gdi anlatımı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

12 Nisan 2012 Perşembe

C# Resmi Yeniden Boyutlandırma

Merhaba arkadaşlar. Bu makalemde sizlere bir resmi istediğimiz oranda nasıl büyültürüz nasıl küçültürüz nasıl genişletip nasıl daraltırız durumlarını anlatmaya çalışacağım.Mesela çok güncel bir örnek vermek gerekirse.Bir siteye resim yükleyeceksiniz.Fakat yükleyeceğiniz resmin boyutları çok büyük.Ne yapacaksınız ? Resmi yeniden boyutlandırıp kaydedip tekrar yüklemeye çalışcaksınız.Ne kadar uğraştırıcı bir iş değil mi ? Bir de yazılım dünyasından örnek vereyim arkadaşlar.Diyelim ki bir siteniz var .Ve kullanıcılarınız siteye resim yüklemesi yapacaklar.Düşünsenize kim nasıl resim atacak nerden bileceksiniz? Diyelim ki 100 kullanıcıdan her biri ortalama 3 mb lık bir resim yukleseler 300mb yapar.Sayının bu şekilde arttığını düşünün.Site bir süre sonra açılmaz :)

Peki kullanım amaçlarını anladıktan sonra hemen uygulamaya geçelim arkadaşlar ...

Formun tasarımı için bir tane picturebox,bir adet openfiledialog ve 2 adet button ekleyin.Butonların birinin text ine Gözat diğerine ise Yeniden Boyutlandır girin.Gelelim kodlama işlemine...

Aşağıdaki kütüphaneleri kod sayfanızın en üstüne yazın (kod sayfasına geçmenin bir diğer yolu de tasarım anında iken F7 tuşuna basmaktır.


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;
using System.Drawing.Imaging;


Daha sonra aşağıdaki değişkenleri global olarak tanımlayın..


string dosyaYolu = string.Empty;
        Bitmap bmp = null;


Gözat butonuna aşağıdaki kodları yazın ...


if (openFileDialogDosyaAc.ShowDialog() == DialogResult.OK)
            {
                dosyaYolu = openFileDialogDosyaAc.FileName;

                //bir bitmap nesnesi oluşturulur ve seçilen resim bu nesneye yüklenir.  

                bmp = new Bitmap(dosyaYolu);

                pictureBox1.Image = bmp;
  
              //picturebox nesnesinin sizemode özelliği strech olarak ayarlanır.Bunun //sebebi ise seçilen resmin picturebox nesnesinde tam olarak gözükmesini sağlamaktır.

                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            }

Ve geldik en önemli kısma arkadaşlar ... Yeniden boyutlandır butonuna aşağıdaki kodları yazın ...


  Bitmap bmpKucuk = new Bitmap(pictureBox1.Image, 100, 50); // Yeniden boyutlandırmak için //Bitmap sınıfı kullanılır.Picturebox da yüklü olan resim 100 e 50 boyutunda yeniden //boyutlandırılıyor.
            pictureBox1.Image = bmpKucuk;
            pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

C# GDI ile Resim İşleme

Merhaba arkadaşlar. Bu makalemde yapacağım örneği aslına bir çok kez görmüşsünüzdür. Mesela internette dolaşıyorsunuz.Ve süper bir resim gördünüz.O resmi indirmek istediniz.İndirdiniz açıyorsunuz veee bir bakıyorsunuz ki resmin bir yerinde reklam yazısı filan görüyorsunuz.Ne kadar sinir bozucu bir durum değil mi ? Bence de fakat işte şimdi tam bu işlemi yapan uygulama yapacağız. :) Biraz da biz başkalarını sinir edelim değil mi ? Daha iyimser bir örnek verecek olursak diyelim ki e-ticaret sitesi yaptınız ve sadece size ait ürünler var.Bu ürünleri koymak istiyorsunuz.Fakat çalınacak diye korkuyorsunuz.Kendi logonuzu yada web sitenizin adresini resme işlemek istiyorsunuz.Bir resim için kolay bir durum ama diyelim ki yüzlerce resminiz var.Eee her resim için aynı işlemleri mi yapacaksınız.Tabi ki hayır.Birlikte yapacağımız uygulama ile bu işlemi Gdi kullanarak tek bir tuşla halledeceksiniz. Gelelim uygulamayı yapmaya ...

Formun tasarımı için bir tane picturebox,bir adet openfiledialog ve 2 adet button ekleyin.Butonların birinin text ine Gözat diğerine ise İmzala girin.Gelelim kodlama işlemine...

Aşağıdaki kütüphaneleri kod sayfanızın en üstüne yazın (kod sayfasına geçmenin bir diğer yolu de tasarım anında iken F7 tuşuna basmaktır.


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;
using System.Drawing.Imaging;


Daha sonra aşağıdaki değişkenleri global olarak tanımlayın..


string dosyaYolu = string.Empty;
        Bitmap bmp = null;


Gözat butonuna aşağıdaki kodları yazın ...


if (openFileDialogDosyaAc.ShowDialog() == DialogResult.OK)
            {
                dosyaYolu = openFileDialogDosyaAc.FileName;

                //bir bitmap nesnesi oluşturulur ve seçilen resim bu nesneye yüklenir.  

                bmp = new Bitmap(dosyaYolu);

                pictureBox1.Image = bmp;
  
              //picturebox nesnesinin sizemode özelliği strech olarak ayarlanır.Bunun //sebebi ise seçilen resmin picturebox nesnesinde tam olarak gözükmesini sağlamaktır.

                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            }

Ve geldik en önemli kısma ... İmzala buttonuna aşağıdaki kodları yazın ...


bmp = pictureBox1.Image.Clone() as Bitmap; // picturebox da hangi resim yukluyse onu clone lar.

            Graphics g = Graphics.FromImage(bmp);
            string imza = "Koray Düzgün";
            Font f = new Font("Arial", 40,FontStyle.Bold|FontStyle.Italic);// araya seperatör koyarak birden fazla style verebiliriz.
            int x = (pictureBox1.Width / 2) - (Convert.ToInt32(f.Size*imza.Length) /2);
            int y = (pictureBox1.Height / 2) - (f.Height / 2);
           
            g.DrawString(imza, f, Brushes.Gold, new Point(x, y));// bu kısımda imza string değeri resmin tam ortasına çizilir.x ve y noktalarının değerleri değiştirilerek istenilen noktaya işlemi yapabilirsiniz.
           
            pictureBox1.Image = bmp;
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
  


Bir sonraki makalemde görüşmek dileğiyle ...

C# da GDI ile Resmi Siyah Beyaz Yapma

Merhaba arkadaşlar.Daha önceki makalelerimde Gdi konusuna yeterince değindim.Bu makalemde ise hem gdi sınıfını hem de bitmap sınıfını kullanarak güzel bir uygulama yapacağız.Photoshop kullandınız mı daha önce bilmiyorum fakat kısaca şu şekilde anlatayım.Herhangi bir resmi siyah beyaz nasıl yapılır onu anlatacağım.

Öncelikle nasıl yapılır biraz ondan bahsedeyim.Arkadaşlar her bir resim çok küçük renk parçaların bir araya gelmesiyle oluşmaktadır.Bu renk parçalarına pixel denilmektedir.Peki bir resmi nasıl siyah beyaz hale getireceğiz? Tabi ki pixellerden yola çıkacağız.Bütün resmi pixel pixel tarayıp elde ettiğimiz pixelin renklerini değiştireceğiz. Her bir pixel RGB renk kodlarıyla simgelenmektedir.Bir pixel i siyah beyaz yapmak için ise pixel in RGB renk kodlarının ortalamasını alıp tekrar kendine atayacağız.Böylelikle bir resmi siyah beyaz yapmış olacağız.Bu bilgilerden yola çıkarak gelelim formumuzu tasarlamaya ve kodlama işlemine...

Öncelikle formunuza bir adet picturebox , 2 adet button ve bir adet openfiledialog atın.Butonların birinin text ine Gözat diğerine ise Siyah Beyaz girin.Gelelim kodlama işlemine...

Aşağıdaki kütüphaneleri kod sayfanızın en üstüne yazın (kod sayfasına geçmenin bir diğer yolu de tasarım anında iken F7 tuşuna basmaktır.


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;
using System.Drawing.Imaging;


Daha sonra aşağıdaki değişkenleri global olarak tanımlayın..


string dosyaYolu = string.Empty;
        Bitmap bmp = null;


Gözat butonuna aşağıdaki kodları yazın ...


if (openFileDialogDosyaAc.ShowDialog() == DialogResult.OK)
            {
                dosyaYolu = openFileDialogDosyaAc.FileName;

                //bir bitmap nesnesi oluşturulur ve seçilen resim bu nesneye yüklenir.  

                bmp = new Bitmap(dosyaYolu);

                pictureBox1.Image = bmp;
  
              //picturebox nesnesinin sizemode özelliği strech olarak ayarlanır.Bunun //sebebi ise seçilen resmin picturebox nesnesinde tam olarak gözükmesini sağlamaktır.

                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            }

Ve geldik en önemli kısma... Siyah Beyaz butonuna aşağıdaki kodları yazın ...

for (int y = 0; y < bmp.Height; y++) //Pixelleri boyuna olarak tarar.
            {
                for (int x = 0; x < bmp.Width; x++)//Pixelleri yatay olarak tarar.
                {
                    Color eski = bmp.GetPixel(x, y); //Sıradaki pixeli alır.
                    int ortalama = (eski.R + eski.G + eski.B) / 3; //ele alınan pixelin RGB kodlarının ortalamasını alır.
                    Color yeni = Color.FromArgb(eski.A, ortalama, ortalama, ortalama);//Bulunan ortalamanın RGB olarak renk değerini alır.
                    bmp.SetPixel(x, y, yeni);//Pixele yeni RGB kodlarını atar ve pixeli eski yerine koyar.
                }
            }

            pictureBox1.Image = bmp;


Tüm bu işlemleri yaptıktan sonra rahatlıkla çalıştırabilirsiniz.Biraz bekleme yapacaktır.Bunun nedeni ise Gdi kullanılmasıdır.Daha önceki makalelerimde de söylediğim gibi Gdi işlemci destekli çalışır.Bu mantıkla bir resmi istediğiniz renklerde ayarlayabilirsiniz.Çok çeşitli güzel şeyler ortaya çıkarabilirsiniz.Kolay gelsin arkadaşlar...




11 Nisan 2012 Çarşamba

C# GDI Örnek - Dönen Dikdötgenler

Merhaba arkadaşlar bu örneğimizde merkez noktaları aynı olan dikdörtgenlerin döndürülmesini sağlayan uygulama yapacağız.Öncelikle formunuza bir adet buton ve bir adet timer ekleyin.Butonun ismini buttonDonekDikdortgen olarak ayarlayın.Timer in ismini de timerDikdörtgen olarak ayarlayın .Ve son olarak aşağıdaki kodları yazın.





        private void buttonDonekDikdortgen_Click(object sender, EventArgs e)
        {
            timerDikdortgen.Start();
            rnd = new Random();
        }

        int aci = 0;
        Random rnd;
        private void timerDikdortgen_Tick(object sender, EventArgs e)
        {
            this.Refresh();
            Graphics g = this.CreateGraphics();

            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

// üstteki kod satırı çizimlerin daha yumuşak hatlı ve daha kaliteli olmasını sağlar.


            Color renk = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));


            Pen kalem = new Pen(renk, 2.0f);

            g.TranslateTransform(-250, -200, System.Drawing.Drawing2D.MatrixOrder.Prepend);
            g.RotateTransform(aci, System.Drawing.Drawing2D.MatrixOrder.Append);
            g.TranslateTransform(250, 200, System.Drawing.Drawing2D.MatrixOrder.Append);
            g.DrawRectangle(kalem, 100, 100, 300, 200);
            aci += 1;
        }


Güzel bir görüntü oluşuyor.Timer ın interval özelliğini değiştirerek istediğimiz hızda görüntü oluşturabiliriz.



C# GDI ile Atom Çizdirmek

Merhaba arkadaşlar.Bu örneğimde atamon şeklini çizen bir uygulamanın kodlarını sizlerle paylaşacağım.GDI mantığını anlamak için güzel bir örnektir.

Formunuza 1 adet button ve 1 adet timer yerleştirin. button un click olayına timer1.start(); yazın ve timer1 in tick olayına aşağıdaki kodları yazın ...


if (aci == 270)
            {
                this.Refresh();
                aci = 0;
            }


            Graphics g = this.CreateGraphics();
            Pen kalem = new Pen(Color.Blue, 2.0f);
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.TranslateTransform(-200, -150, System.Drawing.Drawing2D.MatrixOrder.Prepend);
            g.RotateTransform(aci, System.Drawing.Drawing2D.MatrixOrder.Append);
            g.TranslateTransform(200, 150, System.Drawing.Drawing2D.MatrixOrder.Append);
            g.DrawEllipse(kalem, 100, 100, 200, 100);
            aci += 45;

            g.FillEllipse(Brushes.Black, 190, 140, 20, 20);




C# GDI Kullanımı 3 Açılı Çizim Yapmak

Merhaba arkadaşlar.Bundan önceki GDI ile ilgili makalelerimde size elimden geldiğince GDI sınıfını ve mantığını anlatmaya çalıştım.Fakat o makalelerimde verdiğim örnekler ve sizlere anlattığım bilgilerle ancak ve ancak tek düze çizimler yapabiliyorduk.Fakat bu makalemde sizlere yapacağınız çizimleri dilediğiniz açıda nasıl çizebileceğinizi anlatacağım.Umarım faydalı olur ...

Eğer açılı çizim yapmak istiyorsanız uymanız gereken bir takım kurallar vardır.
-Öncelikle her zaman ki gibi çizim alanını belirtmeniz gerekir.
-Belirtilen alanın sol üst noktasının X ve Y koordinatları formunuzun (0,0) noktasına taşımanız gerekir.Yalnız en önemli noktalardan birisi taşıma işlemi yapılırken formun (0,0) noktasıyla tuvalin X Y koordinatlarının farkı verilir.Çok önemlidir.Sakın unutmayın direk (0,0) noktasını vermiyoruz.Farkını veriyoruz arkadaşlar.
-Çizim alanımızı formun 0,0 noktasına taşıdıktan sonra istediğimiz açı değerini vererek çizim alanımızı döndürüyoruz.
-Çizim yapacağımız alanı döndürdükten sonra eski koordinatına yani istediğimiz noktaya geri taşıyoruz.Bakın dikkat edin aynı şekilde taşıma işlemi yapılıyor.Direk koordinat noktaları verilip bir noktadan al diğerine bırak işlemi yok.İki nokta arasındaki farklar belirtiliyor.
-Evet tuvalimizi eski yerine taşıdıktan sonra artık çizimimizi rahatlıkla yapabiliriz.Özetlemek gerekirse tuvalini yarat.(0,0) noktasına taşı , açısını ayarlayıp döndür,tekrar eski yerine al ve çizimi yap şeklinde aşamalardan oluşmaktadır.

Evet gelelim mantığını anladıktan sonra kodlara ...


Graphics g = this.CreateGraphics(); // çizim alanı yaratılır.
            Pen kalem = new Pen(Color.DarkBlue, 2.0f); // çizim için kalem oluşturulur.

            g.TranslateTransform(-250, -200, System.Drawing.Drawing2D.MatrixOrder.Prepend);

// çizim alanımız (0,0) noktasına taşınır.Bakın buradan çizimin yapılacağı alan daha önceden
//250,200 noktasından itibaren yapılacağı düşünülmüştür ve ona göre taşıma işlemi yapılmıştır
//Dikkat edilmesi gerek bir nokta daha var ki o da MatrixOrder kısmıdır.Bu kısımda öncelik //sırası belirtilir.İlk yapılacak olana Prepend değeri verilir.Ondan sonraki çizim alanı //ayarlamalarında ise Appen durumu verilir.


            g.RotateTransform(45, System.Drawing.Drawing2D.MatrixOrder.Append);

//Çizim alanı taşındıktan sonra istenilen açıda döndürme işlemi yapılır.

            g.TranslateTransform(250, 200, System.Drawing.Drawing2D.MatrixOrder.Append);

//Çizim alanı döndürme işlemi yapıldıktan sonra tekrar asıl koordinatına geri taşınır.

            g.DrawRectangle(kalem, 100, 100, 300, 200);

// en son olarak da çizim alanı ile ilgili tüm işlemler yapıldıktan sonra çizim işlemi //gerçekleşir.Fakat bu işlemlerde sıra çok önemlidir.İyi düşünülüp yapılmalıdır.


Umarım yararlı olmuştur.Bir diğer makalede görüşmek dileğiyle ... 

C# GDI Kullanımı 2

Merhaba arkadaşlar . Gdi sınıfında kaldığımız yerden devam edelim. C# GDI Giriş 1 başlıklı makalemde gdi ın mantığını çizim mantığını dikkat edilmesi ve unutulmaması gerekilen önemli noktaları anlatıp Gdi sınıfını kullanmaya başlamıştım.Son olarak C# da daire çizmeyi anlatmıştım.Kaldığımız yerden devam edelim.

Örnek 4 : Yazı Çizmek :

Bir önceki makalemde form da dahil aslında tüm nesneler bir çizim ürünüdür diye anlatmıştım.Bu bilgiden yola çıkarak istediğim font ta istediğim boyutta ve istediğim yere yazı da çizdirebilirim.

Bu işlem için kullanılacak komut ; DrawString ...


g.DrawString("Koray DÜZGÜN", new Font("Arial", 28f), Brushes.BlueViolet, 150, 150);

DrawString komutunun istediği parametreler (çizimYapılacakYazı,Fontu,Brush/*yani fırça*/,X1.Y1)

Yazı çizim işleminde dikkat ettiyseniz Pen değil Brush istemiştir.Ve X1 ve Y1 noktaları da yazının sol üst noktasının bulunacağı konumdur.

Örnek 5 : Pasta Dilimi Çizmek :

Daha önce bir çok yerde görmüşsünüzdür mutlaka.Ağırlıklı kullanım alanı istatistik-i bilgiler vermektir.

Bu işlem için kullanılacak komut : DrawPie ...

g.FillPie(Brushes.Chocolate, 100, 100, 200, 200, 0, 45);

İstediği parametreler(Brush,Başlangıç X koordinatı,Başlangıç Y koordinatı,Genişliği,Yüksekliği,Başlangış açısı,Kaç derece çizileceği)



C# GDI Giriş 1

Merhaba arkadaşlar.Bu makalemde sizlere GDI sınıfından bahsedeceğim.Nedir bu Gdi ? Gdi'a girmeden önce şunu belirtmekte fayda görüyorum.Düşünün bir form oluşturdunuz projenizde ve bu forma çeşitli nesneler eklediniz.PictureBox indan tutun GridView ına kadar her ne eklerseniz ekleyin formunuza aslında eklediğiniz her bir nesne formunuz üzerine çiziliyordur.Yani kısaca sizin gördüğünüz aslında bir resimdir.Formunuz da bu gördüğünüz resmin tuvalidir arkadaşlar.Hatta oluşturduğunuz form bile çizilerek oluşturulmaktadır.Ekranınızın görüntü frekanslarına göre ortalama saniyede 50 60 kez çiziliyor formunuz ve formunuz içerisindeki nesneler.

Bu ön bilgi ışığında tekrardan GDI a geçelim.Ne demiştik form dahi her nesne ekranda çiziliyor.İşte bizim de kendi çizimlerimizi, kendi grafiklerimizi , kendi resimlerimizi vs. çizmemiz için oluşturulmuş bir sınıftır.GDI ekran kartı üzerinde (GPU) değil işlemci (CPU) üzerinde işlemlerini yapmaktadır.Dolayısıyla çok fazla kullanılan bir sınıf değildir.Fakat bilmekte kesinlikle fayda vardır.

Peki neler yapabilirim ben GDI sınıfını kullanarak? Basit bir çizgiden tutun da grafiksel pasta dilimlerine , yazı çiziminden tutun da resim işlemeye kadar bir çok işlemleri kolaylıkla yapabilirsiniz.Adım adım örneklerle yapabileceklerinizi elimden geldiğince anlatmaya çalışacağım ...

Fakat arkadaşlar örneklere geçmeden önce çizim yapmak için bilmeniz gereken önemli konular var.Bunlardan bir tanesi formunuza (formunuz da dahil) herhangi bir nesne sürükleyip bıraktığınızda bu nesnenin bir location(konum) bilgisi vardır.X ve Y. Burdaki X nesnenin içinde bulunduğu formun X inden olan uzaklığıdır.Buna keza aynı şekilde Y bilgisi ise formun Y noktasından olan uzaklığıdır.Formunuzun X ve Y noktaları ise formunuzun ekranda bulunduğu X ve Y noktalarıdır.Ve unutulmaması gereken en önemli bilgi ise bu X ve Y noktaları gerek nesnelerin gerekse formun size göre sol üst uç noktası (0,0) olarak kabul edilip değer alır.


Önemli Not: Arkadaşlar burada yapacağımız işlem çizim olacağı için öncelikle çizim alanımızı yani kullanacağımız tuval i belirtmemiz gerekmektedir.Bunun sebebi de düşünün elinize çizim yapmanız için gerekli olan araçları aldınız.Çizime hazırsınız.İyi güzel de nereye çizim yapacaksınız.İşte aynı bu mantıktan yola çıkarak öncelikle çizim yapacağımız tuval imizi belirtiyoruz.


Graphics g = this.CreateGraphics();

 Şeklinde graphics sınıfını kullanarak çizim yapacağım tuvalimi oluşturmuş oldum ve ismie de g dedim.


Not : this kelimesi formumu işaret etmektedir.Ben tuval olarak formumu kullanıyorum arkadaşlar anlatacağım tüm örneklerimde.



Örnek 1 : Çizgi Çizmek


DrawLine komutu kullanılarak çizim yapılır.


Pen kalem = new Pen(Color.Blue, 2.0f);
g.DrawLine(kalem, 10, 10, 200, 10);

DrawLine komutunun benim kullandığım şeklinde benden istediği parametreler : (Pen,float x1,float y1,float x2, float y2) 

Şimdi burda istenilen X1 ve Y1 parametreleri çizgimin başlangıç koordinatı , X2 ve Y2 parametreleri de çizgimin bitiş koordinatlarıdır.

Örnek 2 : DikDörtgen Çizmek

DrawRectangle komutu kullanılır. İstediği parametreler (Pen,float x1,float y1,float x2, float y2) . Burada X1 ve Y1 parametreleri dikdörtgenin sol üst noktasının koordinatlarıdır.X2 ve Y2 parametreleri de sağ alt noktasının koordinatlarıdır.

g.DrawRectangle(new Pen(Color.Red, 2.0f), 30, 30, 300, 150);

Örnek 3 : Elips veya Daire Çizmek

DrawEllipse komutu kullanılır. İstediği parametreler (Pen,float x1,float y1,float x2, float y2) Burada mantık biraz farklıdır. Aslında yapılan sizden bir dikdörtgen alan belirlemenizdir.Daha sonrasında C# bu alanın içerisine daireyi veya elips i çizer.Kenarlara teğet olarak yerleştirir. Bu açıdan baktığımızda X1 ve Y1 dikdörtgenin sol üst noktasının koordinatları , X2 ve Y2 ise dikdörtgenin sağ alt noktasının koordinatlarıdır.

g.DrawEllipse(new Pen(Brushes.Aqua), 50, 50, 300, 200);