URL'den resim nasıl indirilir


106

Bağlantının sonunda url'de bir resim biçimi yoksa, c # içindeki bir url'den doğrudan bir resim indirmenin bir yolu var mı? URL örneği:

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

URL bir resim formatıyla bittiğinde resmin nasıl indirileceğini biliyorum. Örneğin:

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

Yanıtlar:


137

Basitçe Aşağıdaki yöntemleri kullanabilirsiniz.

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

Bu yöntemler neredeyse DownloadString (..) ve DownloadStringAsync (...) ile aynıdır. Dosyayı C # dizesi yerine Dizinde depolarlar ve URi'de Biçim uzantısına gerek yoktur.

Görselin Formatını (.png, .jpeg vb.) Bilmiyorsanız

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

Kullanarak

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
@Arsman Ahmad, başka yerde aranması veya sorulması gereken tamamen farklı bir soru. Bu konu tek bir görüntünün indirilmesi içindir.
AzNjoE

79

Görüntü formatını bilip bilmediğinize bağlı olarak, işte bunu yapmanın yolları:

Görüntü formatını bilerek Resmi bir dosyaya indirin

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

Görüntü formatını bilmeden Resmi bir dosyaya indirin

Image.FromStreamHer türlü normal bitmap'i (jpg, png, bmp, gif, ...) yüklemek için kullanabilirsiniz , dosya türünü otomatik olarak algılar ve url uzantısını kontrol etmenize bile gerek kalmaz (bu çok iyi bir uygulama). Örneğin:

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

}

Not: Image.FromStreamİndirilen içerik bilinen bir görüntü türü değilse ArgumentException atılabilir .

Mevcut tüm formatları bulmak için MSDN'deki bu referansı kontrol edin . İşte yapılan atıf vardır WebClientve Bitmap.


2
"Using System.Drawing;" Image.FromStream ()
dlchambers

3
Görüntüleme kitaplığından görüntü biçimini algılamasını istemek yerine, kaynağın görüntünün hangi biçimi kullandığını düşündüğünü görmek için yanıt başlıklarına da bakabilirsinizwebClient.ResponseHeaders["Content-Type"]
bikeman868

Bu aynı zamanda, sıkıştırılmış görüntüyü sıkıştırılmamış bir Bitmap nesnesine genişletmekten çok daha fazla bellek açısından verimli olacaktır ve görüntüyü orijinal sıkıştırması vb.
İle

20

Bir görüntüyü bir dosyaya KAYDETMEDEN indirmek isteyenler için:

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

11

System.DrawingGörüntü formatını bir URI'de bulmak için kullanılması gerekli değildir . System.Drawing.Common NuGet paketini indirmediğiniz sürece System.Drawingkullanılamaz ve bu nedenle bu soruya herhangi bir iyi platformlar arası yanıt göremiyorum..NET Core

Ayrıca, benim örnek kullanmaz System.Net.WebClientçünkü Microsoft, açıkça kullanımından kaçınılmasıSystem.Net.WebClient .

WebClientSınıfı yeni geliştirme için kullanmanızı önermiyoruz . Bunun yerine System.Net.Http.HttpClient sınıfını kullanın .

Bir görüntüyü indirin ve uzantısını bilmeden bir dosyaya yazın (çapraz platform) *

* Eskisiz System.Net.WebClientve System.Drawing.

Bu yöntem, bir görüntüyü (veya URI'nin bir dosya uzantısına sahip olduğu sürece herhangi bir dosyayı) eşzamansız olarak indirir System.Net.Http.HttpClientve ardından URI'de görüntünün sahip olduğu aynı dosya uzantısını kullanarak bir dosyaya yazar.

Dosya uzantısını alma

Dosya uzantısını almanın ilk kısmı, tüm gereksiz parçaları URI'den kaldırmaktır.
Biz kullanmak Uri.GetLeftPart () kadar her şeyi almak için UriPartial.Path ile Schemekarşı up Path.
Başka bir deyişle, https://www.example.com/image.png?query&with.dotsolur https://www.example.com/image.png.

Bundan sonra, yalnızca uzantıyı (önceki örneğimde) elde etmek için Path.GetExtension () kullanıyoruz .png.

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

Görselin indirilmesi

Buradan itibaren dümdüz olmalı. Görüntüyü HttpClient.GetByteArrayAsync ile indirin, yolu oluşturun, dizinin var olduğundan emin olun ve ardından baytları File.WriteAllBytesAsync () ile yola yazın (veya File.WriteAllBytes.NET Framework kullanıyorsanız)

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

Aşağıdaki kullanım yönergelerine ihtiyacınız olduğunu unutmayın.

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

Örnek kullanım

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

Notlar

  • HttpClientHer yöntem çağrısı için yeni bir tane oluşturmak kötü bir uygulamadır . Uygulama boyunca yeniden kullanılması gerekiyor. Burada bulabileceğiniz ImageDownloader, doğru şekilde yeniden kullanan HttpClientve düzgün bir şekilde elden çıkaran daha fazla dokümantasyon içeren (50 satır) kısa bir örnek yazdım .

5

.net Framework, PictureBox Control'ün url'den Resim Yüklemesini sağlar

ve Laod Complete Etkinliğinde görüntüyü kaydedin

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

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

4

Bunu dene, benim için çalıştı

Bunu Denetleyicinize yazın

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

İşte benim görüşüm

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

1

Bulduğum yayınların çoğu, ikinci bir yinelemeden sonra zaman aşımına uğrayacak. Özellikle de benim gibi görüntüler varsa, bir gruptan geçiyorsanız. Dolayısıyla, yukarıdaki önerileri iyileştirmek için tüm yöntem şudur:

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;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.