दिलचस्प पोस्ट
ब्राउज़र में उपयोगकर्ता के लोकेल को निर्धारित करने का सर्वोत्तम तरीका आईआईएस एक्सप्रेस वेब सर्वर को लॉन्च करने में असमर्थ मेरा कार्यक्रम बनाने का सबसे अच्छा तरीका क्या होगा? यह देखने के लिए कैसे जांच करें कि क्या मान एक MySQL में पूर्णांक है? एक नियंत्रक में पैरामीटर से एक Grails तिथि बाध्यकारी कोणीयर्स 1.6.0 (नवीनतम अब) मार्ग काम नहीं कर रहे हैं एक फ़ाइल में शब्दों की आवृत्ति गणना करने के लिए शानदार तरीके गैरकानूनीस्टेट अपवाद जब एक टुकड़ा की जगह जब एक संख्या की उम्मीद होती है तो स्ट्रिंग टाइप करते समय कान के साथ अनंत लूप कैसे iPhone एसडीके में कड़ी चोट इशारा का पता लगाने के लिए? Xcode 6.xx में अनुपयोगी उपकरण खंड दिखाई दिया जावा में यूआरएल से जेएसएन को पढ़ने का सबसे आसान तरीका डाटा ऑब्जेक्ट्स डेटाबेस में कैसे संग्रहीत हैं? मेरे लिनक्स सिस्टम के तहत सभी के लिए पर्यावरण चर कैसे सेट करें? सी # एक enum के माध्यम से बदलना? (इंडेक्सिंग सिस्टम। अर्रे)

वेबपेज को एएसपी.नेट से छवि में कनवर्ट करें

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

वेब के समाधान से एकत्रित समाधान "वेबपेज को एएसपी.नेट से छवि में कनवर्ट करें"

ठीक है, यह बहुत आसान था जब मैंने कई भिन्न समाधान जोड़ दिए:

इन समाधानों से मुझे एएसपी.नेट से वेबब्राउजर का उपयोग करने के लिए एक धागा-सुरक्षित तरीका दिया गया है:

http://www.beansoftware.com/ASP.NET-Tutorials/Get-Web-Site-Thumbnail-Image.aspx

http://www.eggheadcafe.com/tutorials/aspnet/b7cce396-e2b3-42d7-9571-cdc4eb38f3c1/build-a-selfcaching-asp.aspx

इस समाधान ने मुझे बीएमपी को जेपीजी में बदलने का एक तरीका दिया:

Bmp को jpg / png सी # में

मैं बस कोड अनुकूलित और एक। सीएस में निम्नलिखित डाल दिया:

using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Threading; using System.Windows.Forms; public class WebsiteToImage { private Bitmap m_Bitmap; private string m_Url; private string m_FileName = string.Empty; public WebsiteToImage(string url) { // Without file m_Url = url; } public WebsiteToImage(string url, string fileName) { // With file m_Url = url; m_FileName = fileName; } public Bitmap Generate() { // Thread var m_thread = new Thread(_Generate); m_thread.SetApartmentState(ApartmentState.STA); m_thread.Start(); m_thread.Join(); return m_Bitmap; } private void _Generate() { var browser = new WebBrowser { ScrollBarsEnabled = false }; browser.Navigate(m_Url); browser.DocumentCompleted += WebBrowser_DocumentCompleted; while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } browser.Dispose(); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // Capture var browser = (WebBrowser)sender; browser.ClientSize = new Size(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.ScrollBarsEnabled = false; m_Bitmap = new Bitmap(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.BringToFront(); browser.DrawToBitmap(m_Bitmap, browser.Bounds); // Save as file? if (m_FileName.Length > 0) { // Save m_Bitmap.SaveJPG100(m_FileName); } } } public static class BitmapExtensions { public static void SaveJPG100(this Bitmap bmp, string filename) { var encoderParameters = new EncoderParameters(1); encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters); } public static void SaveJPG100(this Bitmap bmp, Stream stream) { var encoderParameters = new EncoderParameters(1); encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); } public static ImageCodecInfo GetEncoder(ImageFormat format) { var codecs = ImageCodecInfo.GetImageDecoders(); foreach (var codec in codecs) { if (codec.FormatID == format.Guid) { return codec; } } // Return return null; } } 

और इसे इस प्रकार कॉल कर सकते हैं:

 WebsiteToImage websiteToImage = new WebsiteToImage( "http://www.cnn.com", @"C:\Some Folder\Test.jpg"); websiteToImage.Generate(); 

यह एक फ़ाइल और स्ट्रीम दोनों के साथ काम करता है सुनिश्चित करें कि आप System.Windows.Forms के संदर्भ को अपने ASP.NET प्रोजेक्ट में जोड़ते हैं। आशा है कि ये आपकी मदद करेगा।

अद्यतनः मैंने पूर्ण पृष्ठ पर कब्जा करने की क्षमता को शामिल करने के लिए कोड को अपडेट किया है और इसमें केवल एक हिस्से पर कब्जा करने के लिए किसी विशेष सेटिंग की आवश्यकता नहीं है।

यहां एक्सटेंशन के तरीकों और कार्य कारखाने के बजाय मेरा कार्यान्वयन है:

 /// <summary> /// Convert url to bitmap byte array /// </summary> /// <param name="url">Url to browse</param> /// <param name="width">width of page (if page contains frame, you need to pass this params)</param> /// <param name="height">heigth of page (if page contains frame, you need to pass this params)</param> /// <param name="htmlToManipulate">function to manipulate dom</param> /// <param name="timeout">in milliseconds, how long can you wait for page response?</param> /// <returns>bitmap byte[]</returns> /// <example> /// byte[] img = new Uri("http://www.uol.com.br").ToImage(); /// </example> public static byte[] ToImage(this Uri url, int? width = null, int? height = null, Action<HtmlDocument> htmlToManipulate = null, int timeout = -1) { byte[] toReturn = null; Task tsk = Task.Factory.StartNew(() => { WebBrowser browser = new WebBrowser() { ScrollBarsEnabled = false }; browser.Navigate(url); browser.DocumentCompleted += (s, e) => { var browserSender = (WebBrowser)s; if (browserSender.ReadyState == WebBrowserReadyState.Complete) { if (htmlToManipulate != null) htmlToManipulate(browserSender.Document); browserSender.ClientSize = new Size(width ?? browser.Document.Body.ScrollRectangle.Width, height ?? browser.Document.Body.ScrollRectangle.Bottom); browserSender.ScrollBarsEnabled = false; browserSender.BringToFront(); using (Bitmap bmp = new Bitmap(browserSender.Document.Body.ScrollRectangle.Width, browserSender.Document.Body.ScrollRectangle.Bottom)) { browserSender.DrawToBitmap(bmp, browserSender.Bounds); toReturn = (byte[])new ImageConverter().ConvertTo(bmp, typeof(byte[])); } } }; while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } browser.Dispose(); }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); tsk.Wait(timeout); return toReturn; } 

श्री कैट मैन डू द्वारा अच्छा समाधान

मुझे कुछ वेबपेजों में आने वाली कुछ त्रुटियों को दबाने के लिए एक पंक्ति जोड़ने की आवश्यकता है (मेरे एक भयानक सहयोगी की मदद से)

 private void _Generate() { var browser = new WebBrowser { ScrollBarsEnabled = false }; browser.ScriptErrorsSuppressed = true; // <-- browser.Navigate(m_Url); browser.DocumentCompleted += WebBrowser_DocumentCompleted; } 

धन्यवाद श्री डू

इस विषय पर पीटर ब्रॉमबर्ग का एक अच्छा लेख है। उसका समाधान आपको क्या करना चाहिए लगता है …

आप एक नया ब्राउज़र खोलने के लिए WatiN का उपयोग कर सकते हैं, फिर स्क्रीन पर कब्जा कर लें और इसे उचित रूप से क्रॉप करें।

समाधान एकदम सही है, बस लाइन में एक निर्धारण की आवश्यकता है जो छवि के WIDTH सेट करता है। बड़े ऊंचाई वाले पृष्ठों के लिए, यह उचित रूप से WIDTH को सेट नहीं करता है:

  //browser.ClientSize = new Size(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.ClientSize = new Size(1000, browser.Document.Body.ScrollRectangle.Bottom); 

और System.Windows.Forms के संदर्भ को जोड़ने के लिए, आपको इसे COM-tab के बजाय ADD संदर्भ के .NET- टैब में करना चाहिए।