Capture d’écran d’une page Web par programme

Comment prendre une photo d’une page Web par programme avec l’URL en entrée?

Et voici ce que j’ai jusqu’à maintenant:

// 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(); 

Mais ça ne fonctionne pas. Cela ne fait que me donner une image blanche et blanche. Qu’est-ce que j’oublie ici?

Existe-t-il un autre moyen d’obtenir la capture d’écran d’une page Web par programme?

J’ai cherché et cherché et trouvé et trouvé le thumbnailer de la page Web (un article de The Code Project ).

Dessiner le contrôle du navigateur sur un bitmap est quelque peu peu fiable. Je pense qu’il vaudrait mieux ne pas faire de screenscrape votre fenêtre.

 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); } 

Vous pouvez essayer d’appeler la fonction native PrintWindow .

Vous pouvez également essayer P / Invoking BitBlt() partir de gdi32.dll . Essayez ce code:

 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); 

Le P / Invoke serait:

 [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);