从 URL 获取图像但未完全加载

2023-12-10

我试图从 URL 获取图像,但当我将其保存到文件时,它是实际图像的一半!我搜索了许多网站和解决方案,例如 HttpWebRequest.BeginGetResponse 因为我认为这是因为我必须缓冲数据,但它不起作用。我不知道我的代码的哪一部分是错误的并导致这个问题!:(

这是从 URL 检索图像的代码:

 public static Bitmap GetImageFromUrl(string url)
    {
        string RefererUrl = string.Empty;
        int TimeoutMs = 22 * 1000;
        string requestAccept = "*/*";
        string UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7";

        Bitmap img = null;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

        request.UserAgent = UserAgent;
        request.Timeout = TimeoutMs;
        request.ReadWriteTimeout = TimeoutMs * 6;
        request.Accept = requestAccept;

        if (!string.IsNullOrEmpty(RefererUrl))
        {
            request.Referer = RefererUrl;
        }

        try
        {
            WebResponse wResponse = request.GetResponse();
            using (HttpWebResponse response = wResponse as HttpWebResponse)
            {
                Stream responseStream = response.GetResponseStream();
                img = new Bitmap(responseStream);
                response.Close();
            }
        }
        catch (Exception)
        {
        }
        return img;
    }

这是将图像保存在文件中的代码:

        byte[] imgBytes = tile.Image;
        using (MemoryStream ms = new MemoryStream(imgBytes))
        {
            using (Image img = Image.FromStream(ms))
            {
                ms.Dispose();
                Bitmap tempBmp = new Bitmap(img);
                img.Dispose();

                string activeDir = Environment.CurrentDirectory;
                string newPath = System.IO.Path.Combine(activeDir, "Images");
                System.IO.Directory.CreateDirectory(newPath);

                newPath = System.IO.Path.Combine(newPath, tile.TileType.ToString());
                System.IO.Directory.CreateDirectory(newPath);

                newPath = System.IO.Path.Combine(newPath, tile.Zoom.ToString());
                System.IO.Directory.CreateDirectory(newPath);

                newPath = System.IO.Path.Combine(newPath, tile.X.ToString());
                System.IO.Directory.CreateDirectory(newPath);

                newPath = System.IO.Path.Combine(newPath, tile.Y.ToString());
                System.IO.Directory.CreateDirectory(newPath);

                string newFileName = "tile.png";
                newPath = System.IO.Path.Combine(newPath, newFileName);

                tempBmp.Save(newPath, ImageFormat.Png);
                tempBmp.Dispose();

您的代码看起来过于复杂,您真的需要读取图像然后重新保存吗? 为什么不能直接保存下载的图像,如下所示:

        public static void GetImageFromUrl(string url)
    {
        string RefererUrl = string.Empty;
        int TimeoutMs = 22 * 1000;
        string requestAccept = "*/*";
        string UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7";

      //  Bitmap img = null;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

        request.UserAgent = UserAgent;
        request.Timeout = TimeoutMs;
        request.ReadWriteTimeout = TimeoutMs * 6;
        request.Accept = requestAccept;

        if (!string.IsNullOrEmpty(RefererUrl))
        {
            request.Referer = RefererUrl;
        }

        try
        {
            WebResponse wResponse = request.GetResponse();
            using (HttpWebResponse response = wResponse as HttpWebResponse)
            {
                Stream responseStream = response.GetResponseStream();
                BinaryReader br = new BinaryReader(responseStream);

                FileStream fs = new FileStream(@"c:\pst\1.jpg", FileMode.Create, FileAccess.Write);

                const int buffsize = 1024;
                byte[] bytes = new byte[buffsize];
                int totalread = 0;

                int numread = buffsize;
                while (numread != 0)
                {
                    // read from source
                    numread = br.Read(bytes, 0, buffsize);
                    totalread += numread;

                    // write to disk
                    fs.Write(bytes, 0, numread);
                }

                br.Close();
                fs.Close();


                response.Close();
            }
        }
        catch (Exception)
        {
        }
    } 

您当然应该将其拆分为方法并设置适当的返回值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 URL 获取图像但未完全加载 的相关文章

随机推荐

  • 如何在php中逐行读取

    当我尝试将每一行插入 Oracle 数据库时 我收到一条错误 指出数字无效 但如果文件中只有一行 则可以正常工作 file fopen file text r while there is another line to read in t
  • 如何使 document.querySelector 在 IE6 中工作

    我在一个网站上工作 我得到了一个在 Internet Explorer 6 中不起作用的 JavaScript 函数 我知道 document querySelector selector 只工作在 Internet Explorer 8
  • PHP 的 DOM 和 SimpleXML 扩展之间有什么区别?

    我无法理解为什么 PHP 中需要 2 个 XML 解析器 有人能解释一下这两者之间的区别吗 简而言之 简单XML 适用于简单的 XML 和 或简单的用例 与节点一起使用的 API 有限 例如 无法对接口进行太多编程 所有节点都是同类 元素节
  • Pandas 重叠重采样

    我想对我的时间索引 DataFrame 进行一些重叠的重新采样 例如 gt gt gt df data date 2018 03 09 12 00 00 1 2018 03 09 12 00 01 1 2018 03 09 12 00 02
  • ARM 系统调用作为 C++ 模板

    我需要在 newlib 存根中调用一些系统调用 当前的实现使用 C 宏 随着时间的推移 这些宏变得不可读且看起来很糟糕 我讨厌宏 然而 我使用 C 模板的实现仅适用于一个参数 template
  • PHP应用程序的评论和回复的递归函数

    我很难概念化用于附加对评论的回复 对回复的回复 对回复的回复的回复等的递归函数 这是我的评论表 Which SHOULD渲染时看起来像这样 按照目前的情况 我可以呈现与article id相关的每条评论 不包括那些NOT NULL 当然 c
  • 获取实现某个抽象类的所有类

    我试图获取实现某个抽象类的所有类 我正在尝试使用以下代码来做到这一点 var type typeof BaseViewComponent var types Assembly GetEntryAssembly GetReferencedAs
  • 媒体播放器应该停止以编程方式断开我的 Android 应用程序中的耳机连接

    我在开发媒体播放器应用程序时遇到问题 我希望这样当我从设备上取下耳机时 我的应用程序中的 MediaPlayer 就会暂停 Android 文档建议使用 AUDIO BECOMING NOISY 意图过滤器 在您的清单中设置意图过滤器 然后
  • 使用 CMake 将文件从源目录复制到二进制目录

    我正在尝试在 CLion 上创建一个简单的项目 它使用 CMake 生成 Makefile 来构建项目 或某种项目 我需要的只是每次运行代码时将一些非项目文件 某种资源文件 传输到二进制目录 该文件包含测试数据 应用程序打开它来读取它们 我
  • Python:使用值的 sum() 优雅地合并字典[重复]

    这个问题在这里已经有答案了 我正在尝试合并来自多个服务器的日志 每个日志都是一个元组列表 date count date可能会出现多次 并且我希望生成的字典能够保存来自所有服务器的所有计数的总和 这是我的尝试 例如一些数据 from col
  • 在 UILabel 中查找子字符串的坐标

    我有一个来自服务器的字符串 我正在 UILabel 上显示它 在该字符串中 我正在识别一些特定的子字符串 我想在该子字符串上放置一个按钮 按钮将是 UILabel 的子视图 为此 我需要子字符串坐标 我经历了这个要点但我无法理解它 假设我的
  • 从Android Market查询最新的应用程序版本

    我可以通过代码在 Android Market 中查询我的应用程序的最新版本吗 我想在新版本可用时向用户显示更新通知 相关问题 在市场上更新我的应用程序的过程 Android 上有没有办法自动更新应用程序 Android 市场应用程序更新
  • “./bin/www”在 Express 4.x 中起什么作用?

    我刚刚开始在我的 Node js 应用程序中学习 Express 4 0 我发现它生成了 bin www文件 其中仅写入应用程序服务器和端口设置 而其他所有内容 例如中间件和路由 都在中定义 app js file 但是 我不确定这是什么
  • 使用java和itext生成带有Unicode字符的PDF文档

    我尝试从打印一些附加 Unicode 符号的 itext 示例中改编标准代码 尽管使用的字体支持这些字符 但我没有得到任何结果 最后一个字符 u2609 不会打印到pdf 提前致谢 These examples are written by
  • 垂直于圆锥体的曲面

    我用 OpenGL C 编写一个程序来对圆锥体进行光线追踪 对于我的强度计算 我需要知道表面法线 给定基础半径 高度和中心坐标 如何计算表面法线 我假设您需要在给定表面上的点的情况下找到表面的法线 我进一步假设这是一个圆锥体 其底座朝下 y
  • Firebase云函数对象可能“未定义”

    我在打字稿中有以下代码 并且在线收到此错误 change after data 对象可能是 未定义 import as functions from firebase functions import as admin from fireb
  • .NET 4.0 中的重大变化

    新 4 0 中有很多关于新功能和类的信息 但也有一些更改可能会影响现有应用程序 例如 Timespan 现在实现了 IFormattable 和旧版本字符串 Format 无效选项将引发异常 而不是调用简单的 ToString 然而 CLR
  • 如何使用 J2EE 容器 (Websphere) 全局设置响应标头

    有没有办法在 Web 服务器级别 web xml 为所有事务设置标头 具体来说 我想这样做 response setHeader Cache Control no cache no store response setDateHeader
  • Environment.TickCount是否受系统时间调整影响?

    我很好奇 NET BCL 属性Environment TickCount 是如何实现的 我现在特别想知道它是否受到以下影响系统时间调整 我对该属性是如何实现的第一个猜测是它只是一个围绕获取TickCount方法 但是 该文档的获取刻度数方法
  • 从 URL 获取图像但未完全加载

    我试图从 URL 获取图像 但当我将其保存到文件时 它是实际图像的一半 我搜索了许多网站和解决方案 例如 HttpWebRequest BeginGetResponse 因为我认为这是因为我必须缓冲数据 但它不起作用 我不知道我的代码的哪一