Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  XML / Web Serv. Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : XML / Web Serv.
Yayınlanma Tarihi : 6.7.2003
Okunma Sayısı : 31362
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 28.3.2024
Turhal Temizer
Mac OS/X Removing CUDA 28.3.2024
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 28.3.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 28.3.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Web Servisleri ile GDI+ Kullanımı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
GDI+, dotNET Framework altyapısının grafik işlemlerini yapmak için sunduğu bir kütüphanedir, windows uygulamalarındaki bir çok kontrol bu arayüzdeki metotların ve sınıfların kullanılmasıyla çizilir, zaten "User Control" dediğimiz kullanıcı tanımlı kontrollerde de sıklıkla GDI+ kütüphanesi kullanılmaktadır. Bu yazıda GDI+ ve Web Servislerini birleştirip grafik uygulaması örneği yapacağız. Peki nasıl? Öncelikle bir web servisimiz olacak. Bu web servisi kendisine gönderilen bir takım bilgiler dahilinde işlemler yapıp bize bilgilerin grafiğine ilişkin resmin bilgisini gönderecek. Bu bilgi çok çeşitli biçimlerde olabilir. Bizim uygulamamızda resim bilgisi byte dizisi şeklinde olacaktır. Web servisine bağlanan istemci, aldığı resim bilgisini istediği şekilde kullanabilir. Bu yazıdaki uygulamada web servisine bağlanan bir ASP.NET sayfası olacak. ASP.NET web sayfası, web servisinden aldığı resim bilgisini bir dosyaya kaydedip yapısındaki bir "Image" kontrolünde görüntülenmesini sağlayacak.

Bu yazıda web servisleri ve GDI+ kütüphanesinin ayrıntıları anlatılmayacaktır. Bu yazının amacı web servisleri ve GDI+ kütüphanesini kullanarak faydalı bir uygulama gerçekleştirmektir.

Web Servisinin Oluşturulması

Yeni bir web servisi projesi başlatın ve adını GDIPasta olarak verin. Çünkü bu web servisinden beklentimiz kendisine gönderilen bilgilere ait pasta şeklindeki grafiğin resim bilgilerini göndermektir. GDI+ kütüphanesindeki System.Drawing ve System.Drawing.Imaging isim alanlarını using ile kaynak kodun başına ekleyin. Muhtemelen bu işlemi yapmadan önce "Add Reference" menüsünden System.Drawing.dll Assembly'sine referans vermeniz gerekecektir.

Web servisimize yeni bir metot ekleyelim ve adını GrafikPasta olarak verelim. Bu metot parametre olarak int türden bir dizi alacaktır. Metodun geri dönüş değeri ise byte türden dizi olacaktır. Parametre olan int türden dizi grafiği çizilecek bilgileri temsil etmektedir. Geri dönüş değeri ise web servisinin oluşturduğu resmin byte dizisi şeklindeki temsilidir. Burda aklınıza şu soru gelmiş olabilir : Neden resmin kendisini oluşturup resmin URL'sini göndermiyoruz da resmin kendisini gönderiyoruz? Bu şekilde yapmamızın özel bir nedeni yok, sizin geliştireceğiniz uygulamanın ihtiyacına göre bu durum değişecektir. Burada önemli olan gelen bilgilere göre resmi nasıl oluşturacağımızdır.

Not : Eklediğiniz metodu [WebMethod] niteliği ile bildirmeyi unutmayın.

Pasta şeklindeki grafikler çizmek için Graphics sınıfın FillPie() ve DrawPie() metotları kullanılmaktadır. Bu iki metodunda parametrik yapısı benzerdir. Tek fark FillPie() metodunun ilk parametresi Brush DrawPie() metodunun ki ise Pen türünden olmasıdır. Bu iki metodun diğer parametreleri ise çizilecek pasta diliminin açısı, pasta diliminin hangi açıdan itibaren çizileceği, dilimin çizileceği grafik nesnesi üzerinde nerden itiabaren çizileceği gibi bilgilerdir. Bu iki metodun parametreik yapısı ile ilgili ayrıntılı bilgiyi MSDN kütühanesinden öğrenebilirsiniz.

Web metodunu yazmadan önce metodun genel işleyişi hakkında bilgi vermek istiyorum. Metoda parametre olarak gelen her bir sayının toplam sayılar üzerindeki yüzdesi hesaplanır ve bu yüzdelere karşılık düşen açılar hesaplanır. Her bir dilimi çizmeden önce bir önceki dilimin açısı toplam açıya eklenir ve böylece bir sonraki dilimin hangi açıdan itibaren çizileceği belirlenmiş olur.

Çizilen pasta grafiğiniz resim olarak geri döndürmek için Bitmap, Graphics ve MemoryStream(System.IO) sınıfları kullanılacaktır. Teorik olarak yeni bir Bitmap nesnesi oluşturulur. Bu resime ilişkin Graphics nesnesi Graphics.FromImage() metodu ile elde edilir. Graphics nesnesinin metotları(FillPie,DrawPie) kullanılarak Bitmap nesnesi hazırlanır ve ardından Bitmap.Save() metodu ile resim bilgisi MemoryStream nesnesine aktarılır. Son olarak MemoryStrem.ToArray() metodu ile resim bilgisi byte dizisne çevrilir ve geri döndürülür.

Bütün bu bilgiler ışığında web metodu aşağıdaki şekilde yazılmıştır.


[WebMethod]
public byte[] GrafikPasta(int[] Dizi)
{
     MemoryStream PastaStream = new MemoryStream();

     int Width,Height,Margin;
     Height = Width =300;

     Margin = 20;

     int [] Bilgiler = Dizi;

     int YariCap = (Width - Margin)/2;

     int Cap = Width - Margin;

     int UsttenBaslangic = (Height/2) - YariCap;

     int SoldanBaslangic = (Width/2) - YariCap;

     int Toplam = 0;

     for(int i=0; i           Toplam += Bilgiler[i];

     SolidBrush[] renkler = {
                                        new SolidBrush(Color.Red),
                                        new SolidBrush(Color.Blue),
                                        new SolidBrush(Color.Yellow),
                                        new SolidBrush(Color.HotPink),
                                        new SolidBrush(Color.Green),
                                        new SolidBrush(Color.Magenta)
                                   };

     Bitmap resim = new Bitmap(Width,Height);

     Graphics g = Graphics.FromImage(resim);

     g.FillRectangle(Brushes.White,0,0,resim.Width,resim.Height);

     float pastaAci = 0, toplamAci = 0;

     Pen p = new Pen(Color.Red,8);

     int fircaNo;

     for(int i=0; i< Bilgiler.Length; i++)
     {
          pastaAci = (Convert.ToSingle(Bilgiler[i]) / Toplam) * 360;

          fircaNo =i % renkler.Length;

          g.DrawPie(p,SoldanBaslangic,UsttenBaslangic,Cap,Cap,toplamAci,pastaAci);

          g.FillPie(renkler[fircaNo],SoldanBaslangic,UsttenBaslangic,Cap,Cap,toplamAci,pastaAci);

          toplamAci += pastaAci;
     }

     resim.Save(PastaStream,ImageFormat.Jpeg);

     return PastaStream.ToArray();
}

Dikkat ettiyseniz resim.Save() metodu ile resmin hangi formatta saklanacağı belirtilmiştir. Ben Jpeg formatını seçtim, sizler isterseniz diğer formatları seçebilirsiniz. Tabi istemci uygulamamız bir web sayfası olduğu için web sayfasında görüntüleyebileceğimiz bir resim formatı seçmeniz doğru olacaktır.

Şimdi sıra web servisine bağlanacak olan istemciyi yazmaya geldi. Öncelikle var olan bir projeye yeni bir ASP.NET projesi ekleyin. Ardından bu eklediğiniz projede web servisine referans vermek için "Add Web Reference" menüsünü seçin ve web servisinin URL'sini girin. Web servislerinin kullanımı ile ilgili eksikleriniz varsa daha önce yazmış olduğum web servisleri makalelerini okumanızı tavsiye ederim.

ASP.NET sayfasında yapmamız gerekenler şunlardır : Web servisine gönderilecek bilgilerin elde edilmesi ve web servisinden dönecek byte disinin resime çevrilerek bir resim kontrolü üzerinde gösterilmesi. Web servisine gönderilecek bilgileri elde etmek için sayfa bir TextBox ve Button ekleyin. TextBox'tan girilen sayı değerleri resim bilgisini oluşturacak değerler olsun. Bu sayılar boşluk karakteri ve '-' karakteri ile ayrılacaktır. Web servisinden dönecek resim bilgisini göstermek içinde sayfa bir Image kontrolü ekleyin. Sayfamızın altyapısı bu şekilde hazır olduğuna göre byte dizisinin nasıl resme çevireceğimiz üzerinde konuşalım : Tabii ki yine GDI+ kütüphanesinden faydalanacağız. Bu yüzden System.Drawing ve System.Drawing.Imaging isim alanlarını eklemeyi unutmayın. Kullanacağımız sınıf Bitmap ve System.IO da bulunan MemoryStrem' dir. Öncelikle TextBox'tan sayılar ayıklanır ve int türden bir diziye aktarılır. Bu dizi web metodunun GrafikPasta() isimli metoduna geçirilir. Web metodundan dönen byte dizisi kullanılarak yeni bir MemoryStream nesnesi oluşturuluır. Oluşturulan bu MemoryStream nesnesi ile yeni bir Bitmap nesnesi oluşturulur ve Bitmap.Save() metodu ile resim istenilen formatta diske kaydedilir. Ve ardından diske kaydedilen resim Image kontrolünün ImageUrl özelliğine atanır.

Yukarıda anlatılan bütün işlemler aşağıdaki gibi Button kontrolünün Click metodu içinde yapılacaktır.



private void Button1_Click(object sender, System.EventArgs e)
{
     byte[] bytes;

     System.IO.MemoryStream PastaGrafik;

     char[] sep = {' ','-'};

     string[] str = TextBox1.Text.Split(sep,100) ;

     int[] Dizi = new int[str.Length];

     for(int i=0; i      {
          Dizi[i] = Convert.ToInt32(str[i]);
     }

     Service1 ws = new Service1();
     bytes = ws.GrafikPasta(Dizi);

     PastaGrafik = new System.IO.MemoryStream(bytes);

     Bitmap Resim = new Bitmap(PastaGrafik);

     string url = @"C:/PastaGrafik.jpeg";

     Resim.Save(url,ImageFormat.Jpeg);

     Image1.Width = Resim.Width;
     Image1.Height = Resim.Height;
     Image1.ImageUrl = url;
     Image1.Visible = true;

     Resim.Dispose();
}

Örnek bir pasta grafiğinin ekran çıktısı ile yazıya son verelim.



Yukarıdaki resimden de gördüğünüz gibi sınırlarınızı zorlayarak C# ve .NET'te her uygulamayı yapmak mümkündür.

Çalışır durumdaki örnek proje dosyasını indirmek için tıklayın.


Makale:
Web Servisleri ile GDI+ Kullanımı XML ve Web Servisleri Sefer Algan
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor