2011-05-05 13 views
5

निम्न कोड चलाता है, लेकिन बिटमैप जेनरेट किया गया है, जो लगभग आधे इंच और नीचे कटऑफ को स्थानांतरित कर दिया गया है। मैंने छवि चौड़ाई और ऊंचाई की जांच की है और यह सही आकार की एक छवि बना रहा है, बस छवि सामग्री को स्थानांतरित कर दिया गया है और कटऑफ। मैं फंस गया हूँ ... कोई विचार?वेबब्राउज़र नियंत्रण से छवियों को सहेजना

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

उत्तर

3

क्या आप कर रहे हैं छवि प्रदर्शित हो रहा है के रूप में यह द्वारा प्रदान की गई है सभी शैलियों के साथ ब्राउज़र। मुझे नहीं पता कि यह वास्तव में आपकी इच्छा क्या है? अगर आप केवल छवि डाउनलोड करना चाहते हैं तो एचटीई अन्य उत्तरों में वर्णित वेब अनुरोध के साथ इसे हल करना आसान है।

तुम सच में पहला कदम से प्रस्तुत करना चाहते हैं के लिए

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

अब आप पूरा प्रदान की गई वेब ब्राउज़र छवि प्राप्त

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

बदलने के लिए है।

यदि आप बड़ी छवियों के लिए भी एक सही समाधान चाहते हैं तो आपको टाइल द्वारा छवि टाइल को भी स्क्रॉल करना होगा।

+0

बड़ी छवियों के लिए वास्तव में स्क्रॉल करना आवश्यक होगा? मेरा वेब ब्राउजर नियंत्रण भी दिखाई नहीं दे रहा है। मुझे लगता है कि ग्राफिक्स ऑब्जेक्ट से इसे प्रस्तुत करना काम करेगा या नहीं, यह छवि काम करेगी या नहीं। मुझे कुछ के साथ प्रयोग करने की आवश्यकता होगी। – toby

+0

मैं पूर्ण पृष्ठों या बड़ी HTML टेबल के लिए रेंडरर का उपयोग करता हूं। वहां मुझे स्क्रॉल करने की ज़रूरत है। –

2

से शुरू करने के लिए मेरा मानना ​​है कि आपके पास प्राप्त आईएमजी तत्व वास्तविक छवि आकार के अलावा एक अलग आकार है।

दूसरा, आप सीधे System.Net.WebRequest का उपयोग क्यों नहीं करते हैं और यूआरएल से वास्तविक छवि डाउनलोड करते हैं। आपके पास पहले से ही यूआरएल है और आईएमजी तत्व की जानकारी पहले से ही है, अगर आप Webbrowser को System.Net.WebRequest का उपयोग करने का प्रयास नहीं करते हैं, तो इस तरह आप यह सत्यापित कर सकते हैं कि आपको कौन सी सामग्री प्रकार मिल रहा है, यह वास्तविक छवि या स्थान धारक है।

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

+1

मैं फिर से छवि को डाउनलोड नहीं करूँगा क्योंकि यह पहले से ही वेबकंट्रोल में लोड हो चुका है। शायद मैं इसे कैश से प्राप्त कर सकता हूं? यदि सब कुछ विफल हो जाता है तो मैं एक वेबरवेस्ट का उपयोग करूंगा और इसे फिर से डाउनलोड करूंगा। धन्यवाद। – toby

1

आप पता है, तो आप इसे का उपयोग बचा सकते हैं:

client.DownloadFile 

जब ग्राहक है एक System.Net.WebClient

-1
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 
+0

क्या आप समझा सकते हैं कि आपका कोड कैसे/क्यों काम करता है? इससे ओपी और अन्य लोग आपकी विधियों को समझने और लागू करने में सक्षम होंगे (जहां लागू हो) कहीं और। कोड-केवल उत्तर [निराश] (http://meta.stackexchange.com/q/148272/284827) और हटाए जाने के लिए उत्तरदायी हैं। - [समीक्षा के दौरान] (http://stackoverflow.com/review/late-answers/11706009) –

संबंधित मुद्दे