Url से इमेज कैसे डाउनलोड करें


103

क्या कोई ऐसा तरीका है जो किसी छवि को सीधे url से c # में डाउनलोड कर सकता है यदि लिंक के अंत में url का कोई छवि प्रारूप नहीं है? Url का उदाहरण:

https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpf1/v/t34.0-12/10555140_10201501435212873_1318258071_n.jpg?oh=97ebc03895b7acee9aebbde7d6b002bf&oe=53C9ABB0&__gda__=1405685729_110e04e71d969d392b63b27ec4f4b24a

मुझे पता है कि जब एक छवि प्रारूप के साथ यूआरएल समाप्त होता है तो छवि कैसे डाउनलोड करें। उदाहरण के लिए:

http://img1.wikia.nocookie.net/__cb20101219155130/uncyclopedia/images/7/70/Facebooklogin.png

जवाबों:


134

बस आप निम्नलिखित विधियों का उपयोग कर सकते हैं।

using (WebClient client = new WebClient()) 
{
    client.DownloadFile(new Uri(url), @"c:\temp\image35.png");
    // OR 
    client.DownloadFileAsync(new Uri(url), @"c:\temp\image35.png");
}

ये विधियाँ लगभग DownloadString (..) और DownloadStringAsync (...) के समान हैं। वे सी # स्ट्रिंग के बजाय डायरेक्टरी में फाइल स्टोर करते हैं और यूआरआई में फॉर्मेट एक्सटेंशन की कोई जरूरत नहीं है

यदि आपको छवि का प्रारूप (.png, .jpeg आदि) नहीं पता है

public void SaveImage(string filename, ImageFormat format)
{    
    WebClient client = new WebClient();
    Stream stream = client.OpenRead(imageUrl);
    Bitmap bitmap;  bitmap = new Bitmap(stream);

    if (bitmap != null)
    {
        bitmap.Save(filename, format);
    }

    stream.Flush();
    stream.Close();
    client.Dispose();
}

उसका इस्तेमाल कर रहे हैं

try
{
    SaveImage("--- Any Image Path ---", ImageFormat.Png)
}
catch(ExternalException)
{
    // Something is wrong with Format -- Maybe required Format is not 
    // applicable here
}
catch(ArgumentNullException)
{   
    // Something wrong with Stream
}

4
@ अरसमान अहमद यह एक पूरी तरह से अलग सवाल है, जिसे कहीं और देखा जाना चाहिए या पूछा जाना चाहिए। यह धागा एकल छवि के डाउनलोड के लिए है।
अज्जो

79

आप छवि प्रारूप को जानते हैं या नहीं, इसके आधार पर, ऐसे तरीके हैं जिनसे आप यह कर सकते हैं:

छवि प्रारूप को जानते हुए, एक फ़ाइल में डाउनलोड करें

using (WebClient webClient = new WebClient()) 
{
   webClient.DownloadFile("http://yoururl.com/image.png", "image.png") ; 
}

छवि प्रारूप को जाने बिना किसी फ़ाइल में छवि डाउनलोड करें

आप Image.FromStreamकिसी भी तरह के सामान्य बिटमैप (jpg, png, bmp, gif, ...) को लोड करने के लिए उपयोग कर सकते हैं , यह फ़ाइल प्रकार को स्वचालित रूप से पहचान लेगा और आपको url एक्सटेंशन की जाँच करने की भी आवश्यकता नहीं है (जो बहुत अच्छा नहीं है अभ्यास)। उदाहरण के लिए:

using (WebClient webClient = new WebClient()) 
{
    byte [] data = webClient.DownloadData("https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpf1/v/t34.0-12/10555140_10201501435212873_1318258071_n.jpg?oh=97ebc03895b7acee9aebbde7d6b002bf&oe=53C9ABB0&__gda__=1405685729_110e04e71d9");

   using (MemoryStream mem = new MemoryStream(data)) 
   {
       using (var yourImage = Image.FromStream(mem)) 
       { 
          // If you want it as Png
           yourImage.Save("path_to_your_file.png", ImageFormat.Png) ; 

          // If you want it as Jpeg
           yourImage.Save("path_to_your_file.jpg", ImageFormat.Jpeg) ; 
       }
   } 

}

नोट: Image.FromStreamयदि डाउनलोड की गई सामग्री एक ज्ञात छवि प्रकार नहीं है, तो इसके द्वारा ArgumentException को फेंक दिया जा सकता है ।

सभी उपलब्ध प्रारूप को खोजने के लिए MSDN पर इस संदर्भ की जाँच करें । यहाँ के संदर्भ में कर रहे हैं WebClientऔर Bitmap


2
ध्यान दें कि आपको "System.Drawing का उपयोग करना चाहिए;" छवि के लिए। फ़्रीस्ट्रीम ()
dlchambers

3
ध्यान दें कि webClient.ResponseHeaders["Content-Type"]
इमेजेज

यह संपीड़ित छवि को एक असम्पीडित बिटमैप ऑब्जेक्ट में विस्तारित करने की तुलना में बहुत अधिक स्मृति कुशल होगा, और आपको छवि को इसके मूल संपीड़न आदि के साथ अपने मूल प्रारूप में सहेजने की अनुमति देगा
bikeman868

20

कोई भी व्यक्ति जो किसी फ़ाइल को सहेजे बिना एक चित्र डाउनलोड करना चाहता है:

Image DownloadImage(string fromUrl)
{
    using (System.Net.WebClient webClient = new System.Net.WebClient())
    {
        using (Stream stream = webClient.OpenRead(fromUrl))
        {
            return Image.FromStream(stream);
        }
    }
}

10

System.DrawingURI में छवि प्रारूप को खोजने के लिए उपयोग करना आवश्यक नहीं है । जब तक आप System.Drawing.Common NuGet पैकेज डाउनलोड System.Drawingनहीं करते हैं, .NET Coreतब तक यह उपलब्ध नहीं है और इसलिए मुझे इस प्रश्न का कोई अच्छा क्रॉस-प्लेटफ़ॉर्म उत्तर नहीं दिखता है।

इसके अलावा, मेरा उदाहरण उपयोग नहीं करता है System.Net.WebClientक्योंकि Microsoft स्पष्ट रूप से उपयोग को हतोत्साहित करता हैSystem.Net.WebClient

हम अनुशंसा नहीं करते हैं कि आप WebClientनए विकास के लिए कक्षा का उपयोग करें । इसके बजाय, System.Net.Http.HttpClient वर्ग का उपयोग करें ।

एक चित्र डाउनलोड करें और इसे विस्तार (क्रॉस प्लेटफॉर्म) को जाने बिना एक फाइल पर लिखें *

* वर्ष के बिना System.Net.WebClientऔर System.Drawing

यह विधि एसिंक्रोनस रूप से एक छवि को डाउनलोड करेगी (या जब तक कि यूआरआई के पास कोई फ़ाइल नहीं है) का उपयोग करके System.Net.Http.HttpClientऔर फिर उसी फ़ाइल एक्सटेंशन का उपयोग करके एक फ़ाइल में लिखें, जैसा कि छवि का यूआरआई में था।

फ़ाइल एक्सटेंशन प्राप्त करना

फ़ाइल एक्सटेंशन प्राप्त करने का पहला हिस्सा यूआरआई से सभी अनावश्यक भागों को हटा रहा है।
हम सब कुछ पाने के लिए Uri.GetLeftPart () का उपयोग UriPartial.Path के साथ Schemeकरते हैं Path
दूसरे शब्दों में, https://www.example.com/image.png?query&with.dotsबन जाता है https://www.example.com/image.png

उसके बाद, हम केवल एक्सटेंशन (मेरे पिछले उदाहरण में ) प्राप्त करने के लिए Path.GetExtension () का उपयोग करते हैं .png

var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);

छवि डाउनलोड कर रहा है

यहां से यह सीधे आगे होना चाहिए। HttpClient.GetByteArrayAsync के साथ छवि डाउनलोड करें , पथ बनाएँ, निर्देशिका मौजूद है और फिर फ़ाइल के साथ पथ को बाइट्स लिखें। WriteAllBytesAsync () या ( File.WriteAllBytesयदि आप .NET फ्रेमवर्क पर हैं)

private async Task DownloadImageAsync(string directoryPath, string fileName, Uri uri)
{
    using var httpClient = new HttpClient();

    // Get the file extension
    var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
    var fileExtension = Path.GetExtension(uriWithoutQuery);

    // Create file path and ensure directory exists
    var path = Path.Combine(directoryPath, $"{fileName}{fileExtension}");
    Directory.CreateDirectory(directoryPath);

    // Download the image and write to the file
    var imageBytes = await _httpClient.GetByteArrayAsync(uri);
    await File.WriteAllBytesAsync(path, imageBytes);
}

ध्यान दें कि आपको निर्देशों का उपयोग करके निम्नलिखित की आवश्यकता है।

using System;
using System.IO;
using System.Threading.Tasks;
using System.Net.Http;

उदाहरण उपयोग

var folder = "images";
var fileName = "test";
var url = "https://cdn.discordapp.com/attachments/458291463663386646/592779619212460054/Screenshot_20190624-201411.jpg?query&with.dots";

await DownloadImageAsync(folder, fileName, new Uri(url));

टिप्पणियाँ

  • HttpClientहर विधि कॉल के लिए एक नया बनाने के लिए यह बुरा अभ्यास है । इसे पूरे आवेदन में पुन: उपयोग किया जाना चाहिए। मैंने ImageDownloaderअधिक प्रलेखन के साथ एक (50 लाइनों) का एक छोटा उदाहरण लिखा है जो सही तरीके से पुन: उपयोग करता है HttpClientऔर इसे ठीक से निपटान करता है जिसे आप यहां पा सकते हैं ।

5

.net फ्रेमवर्क, चित्र बॉक्स को url से चित्र लोड करने की अनुमति देता है

और लाओड कम्प्लीट इवेंट में इमेज सेव करें

protected void LoadImage() {
 pictureBox1.ImageLocation = "PROXY_URL;}

void pictureBox1_LoadCompleted(object sender, AsyncCompletedEventArgs e) {
   pictureBox1.Image.Save(destination); }

4

यह कोशिश करो यह मेरे लिए काम किया

इसे अपने कंट्रोलर में लिखें

public class DemoController: Controller

        public async Task<FileStreamResult> GetLogoImage(string logoimage)
        {
            string str = "" ;
            var filePath = Server.MapPath("~/App_Data/" + SubfolderName);//If subfolder exist otherwise leave.
            // DirectoryInfo dir = new DirectoryInfo(filePath);
            string[] filePaths = Directory.GetFiles(@filePath, "*.*");
            foreach (var fileTemp in filePaths)
            {
                  str= fileTemp.ToString();
            }
                return File(new MemoryStream(System.IO.File.ReadAllBytes(str)), System.Web.MimeMapping.GetMimeMapping(str), Path.GetFileName(str));
        }

यहाँ मेरा विचार है

<div><a href="/DemoController/GetLogoImage?Type=Logo" target="_blank">Download Logo</a></div>

1

मेरे द्वारा पाए गए अधिकांश पोस्ट एक दूसरे पुनरावृत्ति के बाद टाइमआउट होंगे। विशेष रूप से अगर आप एक गुच्छा के माध्यम से पाशन कर रहे हैं यदि चित्र जैसा कि मैंने किया है। तो यहाँ ऊपर दिए गए सुझावों को सुधारने के लिए पूरी विधि है:

public System.Drawing.Image DownloadImage(string imageUrl)
    {
        System.Drawing.Image image = null;

        try
        {
            System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(imageUrl);
            webRequest.AllowWriteStreamBuffering = true;
            webRequest.Timeout = 30000;
            webRequest.ServicePoint.ConnectionLeaseTimeout = 5000;
            webRequest.ServicePoint.MaxIdleTime = 5000;

            using (System.Net.WebResponse webResponse = webRequest.GetResponse())
            {

                using (System.IO.Stream stream = webResponse.GetResponseStream())
                {
                    image = System.Drawing.Image.FromStream(stream);
                }
            }

            webRequest.ServicePoint.CloseConnectionGroup(webRequest.ConnectionGroupName);
            webRequest = null; 
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);

        }


        return image;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.