views:

637

answers:

5

I want to take sceenshot of a webpage programmatically given the URL as input.

And here is what I have till now:

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

But this is not working. It is only giving me a white blank pic. What am I missing here?? :-(

Is there any other way I could get the screenshot of a web page programmatically?

+1  A: 

You can try calling the native PrintWindow function.

leppie
+1, was going to suggest the same. There might be one glitch though, with pages instructed to render differently when printed.
Sorin Comanescu
@Sorin Comanescu: `PrintWindow` has nothing to do with printing :)
leppie
@leppie: Can u explain a bit more on this? Please note that I just have the URL of the webpage as input.
Manish
A: 

Drawing the browser control to a bitmap is somewhat unreliable. I think it would be better to just screenscrape your window.

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);
}
Gabe
A: 

You could also try P/Invoking BitBlt() from gdi32.dll. Try this 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);

The P/Invoke would be:

[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);
Simon Linder
+1  A: 

well, I searched and searched and searched....and found it here

Thanks all for your replies.....

Manish
A: 

This question was just asked yesterday, although mainly directed at Perl. Maybe some of the answers there would help you, although would obviously take you another direction. Here's the link.

lundmark