从 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 获取图像但未完全加载 的相关文章

  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 将参数传递给 http.HandlerFunc

    我正在使用 Go 的内置 http 服务器pat http github com bmizerany pat响应某些 URL mux Get products http HandlerFunc index func index w http
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 如何在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 因为我认为这是因为我必须缓冲数据 但它不起作用 我不知道我的代码的哪一