Сохранение изображений из элемента управления WebBrowser - PullRequest
5 голосов
/ 05 мая 2011

Следующий код выполняется, но сгенерированное растровое изображение смещено вниз примерно на полдюйма и обрезано внизу.Я проверил ширину и высоту изображения, и оно создает изображение правильного размера, просто содержимое изображения сдвигается вниз и обрезается.Я в тупике ... есть идеи?

    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 ]

3 голосов
/ 05 мая 2011

То, что вы делаете, это рендеринг изображения в том виде, в котором оно отображается браузером со всеми стилями. Я не знаю, действительно ли это то, чего ты хочешь? Если вы хотите только загрузить изображение, то его проще решить с помощью веб-запроса, как описано в других ответах.

Если вы действительно хотите выполнить рендеринг, тогда первый шаг - изменить

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

до

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

Теперь вы получите полное изображение веб-браузера.

Если вы хотите идеальное решение даже для больших изображений, вам также нужно прокрутить круг и получить изображение по частям.

2 голосов
/ 05 мая 2011

Начнем с того, что я считаю, что полученный вами элемент img имеет другой размер, отличный от фактического размера изображения.

Во-вторых, почему бы вам не использовать прямой System.Net.WebRequest и загрузить фактическое изображение с URL. у вас уже есть URL и уже есть информация об элементе IMG, например, если вы не показываете, что веб-браузер пытается использовать System.Net.WebRequest, таким образом вы можете проверить, какой тип контента вы получаете - это фактическое изображение или заполнитель.

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

1 голос
/ 05 мая 2011

Если у вас есть адрес, вы можете сохранить его, используя:

client.DownloadFile

Когда клиент System.Net.WebClient

0 голосов
/ 21 марта 2016
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...