Toma de captura de pantalla de una página web programáticamente

¿Cómo se hace una captura de pantalla de una página web programáticamente dada la URL como entrada?

Y esto es lo que tengo hasta ahora:

// The size of the browser window when we want to take the screenshot (and the size of the resulting bitmap) Bitmap bitmap = new Bitmap(1024, 768); Rectangle bitmapRect = new Rectangle(0, 0, 1024, 768); // This is a method of the WebBrowser control, and the most important part webBrowser1.DrawToBitmap(bitmap, bitmapRect); // Generate a thumbnail of the screenshot (optional) System.Drawing.Image origImage = bitmap; System.Drawing.Image origThumbnail = new Bitmap(120, 90, origImage.PixelFormat); Graphics oGraphic = Graphics.FromImage(origThumbnail); oGraphic.CompositingQuality = CompositingQuality.HighQuality; oGraphic.SmoothingMode = SmoothingMode.HighQuality; oGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic; Rectangle oRectangle = new Rectangle(0, 0, 120, 90); oGraphic.DrawImage(origImage, oRectangle); // Save the file in PNG format origThumbnail.Save(@"d:\Screenshot.png", ImageFormat.Png); origImage.Dispose(); 

Pero esto no está funcionando. Solo me está dando una imagen blanca en blanco. ¿Que me estoy perdiendo aqui?

¿Hay alguna otra forma en que pueda obtener la captura de pantalla de una página web mediante progtwigción?

Busqué, busqué y busqué, y lo encontré en la página thumbnailer (un artículo de The Code Project ).

Dibujar el control del navegador en un bitmap es poco confiable. Creo que sería mejor que simplemente rastreas tu ventana.

 using (Bitmap bitmap = new Bitmap(bitmapSize.Width, bitmapSize.Height, PixelFormat.Format24bppRgb)) using (Graphics graphics = Graphics.FromImage(bitmap)) { graphics.CopyFromScreen( PointToScreen(webBrowser1.Location), new Point(0, 0), bitmapSize); bitmap.Save(filename); } 

Puede intentar llamar a la función nativa PrintWindow .

También puede probar P / Invoking BitBlt() desde gdi32.dll . Prueba este código:

 Graphics mygraphics = webBrowser1.CreateGraphics(); Size s = new Size(1024, 768); Bitmap memoryImage = new Bitmap(s.Width, s.Height, mygraphics); Graphics memoryGraphics = Graphics.FromImage(memoryImage); IntPtr dc1 = mygraphics.GetHdc(); IntPtr dc2 = memoryGraphics.GetHdc(); // P/Invoke call here BitBlt(dc2, 0, 0, webBrowser1.ClientRectangle.Width, webBrowser1.ClientRectangle.Height, dc1, 0, 0, 13369376); mygraphics.ReleaseHdc(dc1); memoryGraphics.ReleaseHdc(dc2); memoryImage.Save(filename); 

El P / Invoke sería:

 [DllImport("gdi32.dll")] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);