如何以编程方式保存来自 URL 的图像?

Posted

技术标签:

【中文标题】如何以编程方式保存来自 URL 的图像?【英文标题】:How do I programmatically save an image from a URL? 【发布时间】:2010-11-09 18:17:42 【问题描述】:

我正在使用 C#,需要能够从 URL 中获取图像并将它们存储在本地。 ...不,我不是在偷东西 :)

【问题讨论】:

图片是网址还是网址中的图片引用? 特定图片的URL 【参考方案1】:

我的解决方案是将图像预先保存到磁盘,然后作为普通保存的图像使用:

remoteFile = "http://xxx.yyy.com/image1.png"; localFile = "c:\myimage.png";

WebClient webClient = new WebClient(); webClient.DownloadFile(remoteFile, localFile);

【讨论】:

欢迎来到 Stack Overflow。请注意,这与上面接受的答案基本相同,这是十多年前留下的。【参考方案2】:

aspx (c#) 中的一个例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;

public partial class download_file_from_url : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    
        string url = "http://4rapiddev.com/wp-includes/images/logo.jpg";
        string file_name = Server.MapPath(".") + "\\logo.jpg";

        save_file_from_url(file_name, url);

        Response.Write("The file has been saved at: " + file_name);
    

    public void save_file_from_url(string file_name, string url)
    
        byte[] content;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        WebResponse response = request.GetResponse();

        Stream stream = response.GetResponseStream();

        using (BinaryReader br = new BinaryReader(stream))
        
            content = br.ReadBytes(500000);
            br.Close();
        
        response.Close();

        FileStream fs = new FileStream(file_name, FileMode.Create);
        BinaryWriter bw = new BinaryWriter(fs);
        try
        
            bw.Write(content);
        
        finally
        
            fs.Close();
            bw.Close();
        
    

作者:HOAN HUYNHASP.Net C# Download Or Save Image File From URL

【讨论】:

我从http://4rapiddev.com/csharp/asp-net-c-download-or-save-image-file-from-url/复制的【参考方案3】:

这样写会更容易:

WebClient webClient = new WebClient();
webClient.DownloadFile(remoteFileUrl, localFileName);

【讨论】:

酷,别忘了给webclient的Dispose() @Alexander,因为它实现了IDisposable 接口,因此应该被处理掉。但是也有WebClient(来自Silverlight)没有实现IDisposable接口,不能按照上面的方式处理。这个答案是关于 System.Net.WebClient 可能而且应该被处理的。 @Alexander,加油!尽快调用Dispose 意味着尽快释放对象(句柄/内存/其他)使用的资源。是的,对于托管对象,GC 会保存你的培根,但你不能确定确切的时间。至于我,明确地调用Dispose 或使用using 构造是一个经验法则 如果你能给我一篇文章的链接,用可衡量的数据证明这一点,我很乐意学习和相信。一年前我做了很多测试,发现调用Dispose() 并没有立即释放内存。 @Alexander,是的,我已经看到了这个问题和一个很好的答案。查看关于 250MB 位图的部分:...但是你真的想留下 250MB 的内存就坐在那里 - 等待垃圾收集器最终出现并释放它吗?如果有一个开放的数据库连接怎么办?当然,我们不希望那个连接处于打开状态,等待 GC 完成对象【参考方案4】:

您只需使用 HttpWebRequest 为图像的 URI 发出基本的 http 请求,然后获取生成的字节流,然后将该流保存到文件中。

这是一个关于如何执行此操作的示例...

'作为旁注,如果图像非常大,您可能希望将 br.ReadBytes(500000) 分解为一个循环,并在写入每批字节时一次抓取 n 个字节找回它们。'

using System;
using System.IO;
using System.Net;
using System.Text;

namespace ImageDownloader

    class Program
    
        static void Main(string[] args)
        
            string imageUrl = @"http://www.somedomain.com/image.jpg";
            string saveLocation = @"C:\someImage.jpg";

            byte[] imageBytes;
            HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(imageUrl);
            WebResponse imageResponse = imageRequest.GetResponse();

            Stream responseStream = imageResponse.GetResponseStream();

            using (BinaryReader br = new BinaryReader(responseStream ))
            
                imageBytes = br.ReadBytes(500000);
                br.Close();
            
            responseStream.Close();
            imageResponse.Close();

            FileStream fs = new FileStream(saveLocation, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            try
            
                bw.Write(imageBytes);
            
            finally
            
                fs.Close();
                bw.Close();
            
        
    

【讨论】:

你也可以循环直到流结束而不是 br.ReadBytes(500000); 这个对我来说特别好——我不需要物理文件,只需要流,所以在我的情况下,它比公认的答案要好得多。 你能告诉我为什么在位置变量值设置之前使用@。的确,这个答案是 11 年前的 @AhmedsaysReinstateMonica - 它可以防止您必须转义字符串中的某些字符,例如反斜杠。

以上是关于如何以编程方式保存来自 URL 的图像?的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何以编程方式导出/保存 DBML 图?

地址簿以编程方式保存联系人图像

如何以编程方式显示图像水平 UIscrollView

如何以编程方式保存网页?

PHP 以编程方式创建图像缓存URL

如何在 C# 中以编程方式获取 Lync 会议 URL?