10 Haziran 2013 Pazartesi

Web Page Screen Shot ASP.NET


Günlerden yeni gün, yeni görevim ise bir web sayfasının görüntüsünü alıp .bmp uzantısıyla kaydetmek idi. Kulağa gayet basit gelmişti, sonuçta print screen düğmesi bile vardı, ne kadar zor olabilirdi ki? sonra o dediğimin Form Applicationlarda çok basit olduğunu farkettim.. Halbuki ben bu işlemi bir web application da yapmalıydım. Eaaah hikayeleştiremiycem :D cümle kurmaya üşenir oldum hayydi hıyarlısı..

Hikayeleştiremiycem de girişi öyle yaptım şimdi nasıl devam etsem abes olacak.. Abesle iştigal ederekten devam edelim, bayağı araştırdım ben bu işi.. Pek çok örnek de buldum ancak ya .exe kullanmışlar (link : http://nolovelust.com/post/C-Website-Screenshot-Generator-AKA-Get-Screenshot-of-Webpage-With-Aspnet-C), ya paralı ekstradan bir dll kullanmışlar..(http://www.websitesscreenshot.com/) 2 - 3 örnek denedim de.. exe li olan çok başarısızdı, çok kalitesiz bir resim veriyordu.. dll dediğimin bedavasını(!) bayağı aradım ama bulamadım. hehe.. Neyse,, sonra birazdan kopyalayacağım örnekle karşılaştım, kalite olarak gayet başarılı, ekstra bir dll cart curt kullanmıyorsun, ASP.NET in nimetlerinden faydalanıyorsun.. Güzel kod hoş kod.. ilk denediğim URL de sorunsuz harika bir resim elde ettim.. Ama sonra basit bir www.google.com url ini de deneyeyim bari dedim, boş bir resim elde ettim.. meğer bu kodumuz her sayfada çalışmazmış, her scripti desteklemezmiş.. :( Ama bu benim için sorun olmadı belki yanlışlıkla biri bloguma girer de bu kodu alırsa ona problem olabilir diye üzülüyorum .. Hayırlısı olsun,, sonuçta bizim işimizi gördü, görüntüsünü almak istediğimiz sayfayı destekledi şükür :)

Kod şu;


public partial class WebForm2 : System.Web.UI.Page
    {

       protected void Page_Load(object sender, EventArgs e)
        {
            Thread webBrowseThread = new Thread(new ThreadStart(GenerateScreenshot));
            webBrowseThread.SetApartmentState(ApartmentState.STA);
            webBrowseThread.Start();
        }

        //this method on providing the url of the webpage copies the image of that webpage.
       public void GenerateScreenshot()
        {
            //string url = "http://www.websitesscreenshot.com/";
            //string url = "http://www.google.com.tr/";
            //string url = "http://www.codeproject.com/Articles/96028/WCF-Service-with-custom-username-password-authenti";
            string url = "http://jsplumbtoolkit.com/jquery/demo.html";
            
            int width = 1024;
            int height = 768;    
            try
            {
                DateTime timeStamp = DateTime.Now;
                // Load the webpage into a WebBrowser control
                WebBrowser wb = new WebBrowser();
                wb.ScrollBarsEnabled = false;
                wb.ScriptErrorsSuppressed = true;
                wb.Navigate(url);

                WebBrowserReadyState flag = wb.ReadyState;

                while (flag != WebBrowserReadyState.Complete && DateTime.Now < timeStamp.AddSeconds(10))
                {
                    System.Windows.Forms.Application.DoEvents();
                    flag = wb.ReadyState;
                    TimeSpan elapsed = DateTime.Now.Subtract(timeStamp);
                }                            
               
                wb.Width = wb.Document.Body.ScrollRectangle.Width;
                wb.Height = wb.Document.Body.ScrollRectangle.Height;
                if (wb.Width < width)
                {
                    // Take Screenshot of the web pages full width
                    wb.Width = width;
                }
                if (wb.Height < height)
                {
                    // Take Screenshot of the web pages full height
                    wb.Height = height;
                }
                
                // Get a Bitmap representation of the webpage as it's rendered in the WebBrowser control
                Bitmap bitmap = new Bitmap(wb.Width, wb.Height);

                wb.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, wb.Width, wb.Height));
                Graphics Grfx = Graphics.FromImage(bitmap);
                Grfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                Grfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                Grfx.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                Grfx.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                Grfx.DrawImage(bitmap, 0, 0, wb.Width, wb.Height);
                wb.Dispose();
                bitmap.Save(@Server.MapPath("screenShot/output.bmp"), System.Drawing.Imaging.ImageFormat.Bmp);               

            }
            catch (Exception ex)
            {
            }
        }

    }

Örneği aldığım link şu;



Hiç yorum yok:

Yorum Gönder