| |||||||||||
Anasayfa | Toplu SMS | Video | Web Hosting | Makale Ara | Anketler | Sitene Ekle | RSS Kaynağı | |||||||||||
AramaEn Çok Okunan Makaleler |
Web Sitelerinin Ekran Görüntüsünü AlmakWeb Sitelerinin Ekran Görüntüsünü Almak
İster başka web sitelerinin olsun ister kendi web sitenizin iç sayfalarının olsun ekran görüntülerini gerçek zamanlı olarak kullanmaya ihtiyacınız varsa artık kendi kodunuzu yazarak bu işlemleri yapabilirsiniz. Bu makalemizde ASP.NET sunucu taraflı programlama ile bir web sitesinin ekran görüntüsünü almayı ve kullanmayı inceliyoruz. Web sitelerinin ekran görüntülerini (screenshot) alarak kullanıma sunan hizmetler internet üzerinde mevcut. Bu makalemizde ASP.NET tarafında nasıl başka bir sitenin ekran görüntüsü resim olarak alabileceğimizi inceleyeceğiz. İlk olarak ufak bir noktaya değinmekte fayda var; bahsedeceğimiz teknik bazı özel koşullarda (hedef web sitesinin görsel öğeleri JavaScript ile düzenlemesi) başarılı sonuç vermeyebiliyor. O nedenle eğer yüzde yüzlük bir başarı istiyorsanız ihtiyacınız olan hedef web sitesinin ekran görüntüsü otomatik olarak alan bir windows uygulaması ile web siteniz arasında entegrasyon sağlamak. Peki o zaman neden bu işi web ortamında yapıyoruz? Maalesef normal barındırma (hosting) hizmetlerinde sunucu tarafına kendi uygulamalarınızı yüklemenize izin verilemez. Makalemizde izlediğimiz teknikler ile herhangi bir barındırma alanında bu tarz bir uygulama yapabilirsiniz. İlk olarak gelin ufak bir demo ile aslında ne yapacağımızı görelim. Aşağıdaki adreste bu makaledeki kodun kullanıldığı bir uygulama var. Uygulama John K. tarafından makalemizdeki kodun üzerine renk palet analizi de eklenerek düzenlendi. Sistem, girilen adresin ekran görüntüsünü aldıktan sonra görüntü içerisinde kullanılan ana renkleri buluyor. Siz de makalemizdeki yöntemi kullanarak eminim ki çok daha farklı uygulamalar yapabilirsiniz. Eğer beni uygulamalarınızla ilgili haberdar edebilirseniz ayrıca sevinirim. http://www.todotoh.com/rgb/rgbanalysis.aspx İş Başına Peki bu işi nasıl yapacağız? İlk olarak .NET Framework'un en önemli konseptini hatırlatmakta fayda var. Web ile windows uygulamalarında aslında biz aynı Framework'ü kullanıyoruz. Yani eğer istersek windows forms uygulamalarında kullandığımız tüm kütüphaneleri ve objeleri web forms uygulamalarımızda da kullanabiliriz. Bir web sitesinin ekran görüntüsü almak için WinForms'da kullanabileceğimiz WebBrowser adında bir objemiz var. Dim MyBrowser As New WebBrowser Yukarıdaki kodumuz içerisinde yeni bir WebBrowser objesi yarattıktan sonra ekranın kenarlarında kaydırma çubuklarının gözükmemesi için ScrollBarsEnabled özelliğini False olarak düzenliyoruz. Bir sonraki adımda Browser (Tarayıcı) objemizin boyutunu 1024*768 yaparak sanki web sitesi o çözünürlükte bir ekranda açılmışmış gibi bir ortam yaratıyoruz. WebBrowser objesine ait .Navigate metoduna verdiğimiz parametre ile sitemizin yüklenmesini sağlıyoruz. Uygun resim ve çizim alanı değişkenlerimizi de tanımladıktan sonra yine WebBrowser objesine ait .DrawToBitmap metodunu kullanarak görüntüyü değişkenimize alıyoruz. Tabi olay bu kadar kolay değil. Elimizdeki ilk sorun web sitesinin yüklenmesini beklemek zorunda olmamız. Bunun için kör bir döngü kullanacağız. MyBrowser.Navigate(Me.URL) Kodumuzda WebBrowser objesinin ReadyState özelliğini kontrol ederek Complete olana kadar kısır bir döngüye sokuyoruz. Döngü içerisinde kullandığımız Application.DoEvents() kodu döngü süresince WebBrowser'daki yüklemenin kilitlenmemesini ve devam etmesini sağlayacak. Bir sonraki sorunumuz aslında çok daha kritik. WebBrowser objesi özünde bir COM objesi olduğu için Single Threaded bir Thread içerisinde çalıştırılması gerekiyor. Bu aslında biraz da işimize yarar, böylece tüm bu yükleme kodlarını başka bir Thread içerisine almış oluruz.
Yukarıda bir Thread tanımı yer alıyor. Bu tanım içerisinde en önemli nokta ikinci satırdaki kod. Yarattığımız Thread için SetApartmentState diyerek çalışma şeklini SingleThreadedApartment haline çeviriyoruz. Tüm sorunları aştık, geriye kaldı gelen ekran görüntüsünü uygun şekilde küçültme kodumuza. Bu işlem için çok farklı teknikler kullanılabilir, ben aşağıda bu tekniklerden birine ait kodu paylaşacağım. Makalemizin esas konusu bu olmadığı için detaya girmeyeceğim. Dim imgOutput As System.Drawing.Image = myBitmap Şimdi gelin tüm bu kodları birleştirerek bir Class yapısı içerisinde projelerimizde kullanacağımız kodumuzu inceleyelim. Imports System Yarattığımız iki classtan biri olan GetImage programcıdan alacağı ekran görüntüsüne ait çözünürlük bilgilerini ve geri döndüreceği resmin boyut bilgilerini alıyor. Aldığı bilgiler çerçevesinde ekran görüntüsünün alınması sonrasında da görüntünün istenen boyuta küçültülmesini sağlayacak. WebPageBitmap class'ımız ise ekran görüntüsünün alınmasından ve sonrasında da tekrar boyutlandırılmasında sorumlu. Tabi tüm bu işlemleri ayrı bir Thread içerisinde yapmamız gerektiğinden bahsetmiştik. Şimdi de gelin yukarıdaki Class'ımızı sayfamızda nasıl kullanabileceğimize bakalım. Partial Class _Default Code-Behind dosyamızın kodunu yukarda inceleyebilirsiniz. Button1'e tıklandığında uygun Thread'i yaratarak DoIT Sub'ını çalıştıracağı şekilde hazırlıyoruz. Basit bir şekilde Thread'in bitmesini beklemek için yine kısır bir döngü kullanarak ThreadState durumunu kontrol ettik. Ekran görüntüsü alındığı gibi kullanıcıya göstermek için biraz kullanıcıyı bekletmemiz gerekecek. Eğer siz bir AJAX web sitesi hazırlıyorsanız ekran görüntüsünün alınmasını beklemektense bir AJAX Timer ile durumu kontrol edip kullanıcıya bilgi verebilirsiniz. DoIT Sub'ımız içerisine bakarsak aslında bir önceki Class yapımızı kullandığımızı görüyoruz. Ben kodumda ekran görüntüsünü ve oluşursa herhangi bir hatayı farklı yerlere kaydettim. Siz bu konumları değiştirerek farklı yapılar kurabilirsiniz. Tüm bu kodlara ek olarak daha yüksek performanslı bir sonuç için kodunuzun daha önce alınmış ekran görüntülerini kontrol ederek eğer söz konusu adrese ait ekran görüntüsü çok eski değilse yenisini almadan kullanıcıya eskisi de göstermesini sağlayabilirsiniz. Hepinize kolay gelsin.
Yazdırılabilir Sayfa |
Word'e Aktar |
Tavsiye Et
| Yorum Yaz
|
Seçtiklerimiz |
|||||||||
|
© 2004-2009 Tüm Hakları Saklıdır AltınSoft Bilişim Teknolojileri Altyapı: MyDesign Haber Sistemi |
|||||||||||