从WebBrowser控件保存图像

时间:2011-05-05 14:30:09

标签: c# .net browser

以下代码运行,但生成的位图向下移动约半英寸并在底部切断。我检查了图像的宽度和高度,它创建了一个正确尺寸的图像,只是图像内容向下移动和截止。我很难过......任何想法?

    using mshtml;
    using System.Drawing;
    using System.Runtime.InteropServices;

    [ComImport, InterfaceType((short)1), Guid("3050F669-98B5-11CF-BB82-00AA00BDCE0B")]
    private interface IHTMLElementRenderFixed
    {
        void DrawToDC(IntPtr hdc);
        void SetDocumentPrinter(string bstrPrinterName, IntPtr hdc);
    }

    public Bitmap GetImage(string id)
    {
        HtmlElement e = webBrowser1.Document.GetElementById(id);
        IHTMLImgElement img = (IHTMLImgElement)e.DomElement;
        IHTMLElementRenderFixed render = (IHTMLElementRenderFixed)img;

        Bitmap bmp = new Bitmap(img.width, img.height);
        Graphics g = Graphics.FromImage(bmp);
        IntPtr hdc = g.GetHdc();
        render.DrawToDC(hdc);
        g.ReleaseHdc(hdc);

        return bmp;
    }

4 个答案:

答案 0 :(得分:3)

您正在做的是渲染图像,因为浏览器使用所有样式呈现图像。我不知道这是不是你想要的?如果您只想下载图像,那么使用Web请求更容易解决它,如其他答案中所述。

如果你想要渲染而不是第一步就是改变

Bitmap bmp = new Bitmap(img.width, img.height);

Bitmap bmp = new Bitmap(e.OffsetRectangle.Width, e.OffsetRectangle.Height);

现在您可以获得完整呈现的Web浏览器图像。

如果你想要一个完美的解决方案,即使对于大图像,你也必须滚动并逐层获取图像。

答案 1 :(得分:2)

首先我相信你得到的img元素除了实际的图像大小之外还有不同的大小。

其次,为什么不使用直接System.Net.WebRequest并从URL下载实际图像。你已经拥有了URL并且已经有了IMG元素信息,事实上如果你没有显示webbrowser尝试使用System.Net.WebRequest,这样你就可以验证你获得的内容类型是实际图像还是占位符。

http://msdn.microsoft.com/en-us/library/system.net.webrequest.aspx

答案 2 :(得分:1)

如果您有地址,可以使用以下方式保存:

client.DownloadFile

当客户是System.Net.WebClient

答案 3 :(得分:0)

Imports System.Net
Imports System.Runtime.InteropServices
Imports mshtml
--Add reference Microsoft Html Object Library

Sub Dowork()
Dim x = WebBrowser1.Document.GetElementsByTagName("img")
For i As Integer = 0 To x.Count - 1
If x(i).GetAttribute("alt") = "Captcha image" Then
GetImage(x(i)).Save("captcha.png", Imaging.ImageFormat.Png)
End If
Next
End Sub

<ComImport>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
<Guid("3050F669-98B5-11CF-BB82-00AA00BDCE0B")>
Public Interface IHTMLElementRenderFixed
Sub DrawToDC(hdc As IntPtr)
Sub SetDocumentPrinter(bstrPrinterName As String, hdc As IntPtr)
End Interface




Public Function GetImage(e As HtmlElement) As Bitmap
    Dim img As IHTMLImgElement = TryCast(e.DomElement, IHTMLImgElement)
    Dim render As IHTMLElementRenderFixed = TryCast(img, IHTMLElementRenderFixed)
    Dim bmp As Bitmap = New Bitmap(e.OffsetRectangle.Width, e.OffsetRectangle.Height)
    Dim g As Graphics = Graphics.FromImage(bmp)
    Dim hdc As IntPtr = g.GetHdc()
    render.DrawToDC(hdc)
    g.ReleaseHdc(hdc)
    Return bmp
End Function