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