miércoles, 2 de julio de 2014

Crear un thumbnail de un sitio con C#



Existen varios servicios web que nos ayudan a crear fotos de las páginas web o thumbnails pero la mayoría tienen un costo por el servicio. Si no tenemos dinero o no queremos pagar por el servicio, fácilmente podemos crear nuestro propio generador de thumbnails usando C#. Vamos a ver un ejemplo con el que podemos fácilmente desarrollar este servicio.

Lo primero que vamos hacer es crear un “console application” con el nombre de WebPicture donde vamos a tener nuestro código para las fotos de las páginas web que deseamos.

Teniendo este proyecto listo vamos a crear una clase de nombre PictureCreate

Luego de esto debemos agregar las siguientes referencias
  • using System.Drawing;
  • using System.Windows.Forms;
  • using System.Threading;

Luego de esto vamos a crear unas variables para el tamaño del visualizador del navegador o el tamaño de la página que vamos a inspeccionar. Además de las variables para el tamaño de la imagen que deseamos guardar.

  • private int browserWidth { get; set; }
  • private int browserHeight { get; set; }
  • private int bitmapHeight { get; set; }
  • private int bitmapWidth { get; set; }

Ahora vamos a crear una variable de tipo Bitmap donde se va a guardar la imagen resultado de la captura de  la página web

  • private Bitmap picture { get; set; }

Finalmente vamos a crear una variable que se encargue de almacenar el ULR de la página que deseamos guardar.

  • private string url { get; set; }

Ahora ocupamos un constructor que nos permite obtener la información necesaria para llenar las variables que el sistema requiere.


public PictureCreate(string url, int browserWidth, int browserHeight, 
int bitmapWidth, int bitmapHeight)
        {
            this.url = url;
            this.browserWidth = browserWidth;
            this.browserHeight = browserHeight;
            this.bitmapHeight = bitmapHeight;
            this.bitmapWidth = bitmapWidth;
        }

Ahora vamos hacer un método de nombre  StartCreatingPicture() el cual va hacer el punto de inicio de nuestra ejecución y creación de la imagen.

El método  StartCreatingPicture() va a tener un hilo que se va a encargar de hacer la tarea de captura de la imagen de la página web. 


public Bitmap StartCreatingPicture()
{
    ThreadStart BuildingThread = new ThreadStart(BuildingPicture);
    Thread thread = new Thread(BuildingThread);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
    return picture;
}

Este hilo se va a encargar de ejecutar la función con nombre  BuildingPicture() la cual se va a encargar de llamar la página que tenemos en nuestro URL. Cuando la página está totalmente cargada vamos a ejecutar un evento que le vamos a llamar Download_Ready.

private void BuildingPicture()
{
     WebBrowser browser = new WebBrowser();
     browser.ScrollBarsEnabled = false;
     browser.Navigate(url);
     browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(
     Download_Ready);
     while (browser.ReadyState != WebBrowserReadyState.Complete)
         Application.DoEvents();
     browser.Dispose();
}
Cuando el documento está totalmente listo vamos a proceder finalmente a crear la imagen. En el evento que acabamos de hacer vamos a usar el documento o browser que tenemos listo para crear la fotografía usando el método DrawToBitmap del objeto WebBrowser y la almacenamos en la variable picture que tenemos de tipo Bitmap.


private void Download_Ready(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser browser = (WebBrowser)sender;
    browser.ClientSize = new Size(this.browserWidth, this.browserHeight);
    browser.ScrollBarsEnabled = false;
    picture = new Bitmap(browser.Bounds.Width, browser.Bounds.Height);
    browser.BringToFront();
    browser.DrawToBitmap(picture, browser.Bounds);
       if (bitmapWidth != 0 && bitmapHeight != 0)
            picture = (Bitmap)picture.GetThumbnailImage(bitmapWidth, bitmapHeight, 
      null, IntPtr.Zero);
}

Ahora nos vamos al main y creamos un objeto nuevo de nuestra clase PictureCreate y llamamos al método StartCreatingPicture

Debemos almacenar la imagen tomada y la guardamos en el disco duro.


public static void Main(string[] args)
{
    PictureCreate picture = new PictureCreate("http://www.google.com", 
    900, 800, 250, 200);
    Bitmap pic = picture.StartCreatingPicture();
    pic.Save("C:\\Users\\Public\\Pictures\\Sample Pictures\\google.bmp");
}
Espero que les  sea de utilidad este ejemplo.  


Etiquetas: