在Winforms中显示动画gif而不锁定文件

2024-01-07

我正在尝试显示各种文件类型的图像(包括动画.gif文件)在我的 Winforms 应用程序中。我也必须能够修改显示的文件。 (更改文件名,删除它们)。

问题是一个Picturebox 锁定图像文件,直到应用程序关闭 http://support.microsoft.com/kb/309482当使用正常方式时。

这意味着我不能这样做:

private void Form1_Load(object sender, EventArgs e)
    {

        PictureBox pic = new PictureBox();
        pic.Size = new Size(250, 250);
        pic.Image = Image.FromFile("someImage.gif");
        this.Controls.Add(pic);

                    //No use to call pic.Image = null or .Dispose of it
        File.Delete("someImage.gif"); //throws exception
    }

上面链接中的解决方法如下:

    private void Form1_Load2(object sender, EventArgs e)
    {
        PictureBox pic = new PictureBox();
        pic.Size = new Size(250, 250);
                    //using a FileStream
        var fs = new System.IO.FileStream("someImage.gif", System.IO.FileMode.Open, System.IO.FileAccess.Read);
        pic.Image = System.Drawing.Image.FromStream(fs);
        fs.Close();

        this.Controls.Add(pic);

        pic.MouseClick += pic_MouseClick;
    }

这对于普通图像类型来说效果很好,但它不会加载动画 .gif,这对我来说很重要。尝试加载一个会让它看起来像this https://i.stack.imgur.com/50yeY.png.

我发现了一些关于它的其他主题(this https://stackoverflow.com/questions/2097152/creating-wpf-bitmapimage-from-memorystream-png-gif?lq=1 and this https://stackoverflow.com/questions/18167280/image-file-copy-is-being-used-by-another-process?rq=1)但它们都是关于 WPF 并使用 BitmapImage。我已经搜索了如何在 Winforms 应用程序中使用 BitmapImage,但除了它应该以某种方式工作之外没有找到任何东西。

我想继续使用 Winforms,因为我刚刚习惯它,但这不是必需的。

总结一下:我需要一种方法来显示常见图像类型(png、jpg、bmp 和动画 gif),同时仍然能够修改 HDD 上的文件。如果这意味着卸载->修改->重新加载文件,那就可以了。我更喜欢 Winforms,但其他框架也可以。

感谢您的帮助。

编辑:我尝试过的另一种方法

using (System.IO.FileStream fs = new System.IO.FileStream("E:\\Pics\\small.gif", System.IO.FileMode.Open, System.IO.FileAccess.Read))
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            fs.CopyTo(ms);
            pic.Image = Image.FromStream(ms);
        } 

但显示了与第二个示例相同的问题。 gif 无法加载。


使用MemoryStream确实是避免文件锁定的正确方法。顺便说一句,这是一个强大的优化,锁是由 Image 类用来将像素数据保留在分页文件之外的内存映射文件创建的。当位图很大时,这一点非常重要。希望不是动画 gif :)

您的代码片段中存在一个小错误,您忘记将流重置回数据的开头。使固定:

 using (var fs = new System.IO.FileStream(...)) {
     var ms = new System.IO.MemoryStream();
     fs.CopyTo(ms);
     ms.Position = 0;                               // <=== here
     if (pic.Image != null) pic.Image.Dispose(); 
     pic.Image = Image.FromStream(ms);
 } 

如果需要说:做not处理内存流。这会导致以后很难诊断随机崩溃,像素数据被延迟读取。

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

在Winforms中显示动画gif而不锁定文件 的相关文章

  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 在 Locust 中如何从一个任务获取响应并将其传递给其他任务

    我已经开始使用 Locust 进行性能测试 我想向两个不同的端点发出两个发布请求 但是第二个post请求需要第一个请求的响应 如何以方便的方式做到这一点 我已经尝试过如下但没有工作 from locust import HttpLocust
  • Windows Azure 存储表连接超时

    当长时间 几天 运行服务时 我收到来自 Windows Azure 表存储的连接超时异常 即使 get table api 也会返回此异常 为什么会出现这种情况 我该如何解决这个问题 除了 Gaurav 的回答之外 此问题的另一个常见原因是
  • Android 圆形图库或列表视图,具有放大和缩小选项

    我想要一个循环滚动的列表或图库 并且当前项目必须放大 其他项目必须缩小 如下 任何人都可以提供实施的好主意以及任何代码帮助吗 None
  • 不使用指针的递归数据结构

    在攻读计算机科学学士学位期间 我多次遇到过递归数据结构的使用 在 C 中 我总是最终使用指针来使数据结构递归 就像我在 C 中所做的那样 一个简化的示例如下 struct Tree int data struct Tree left rig
  • 执行 Docker Inspect 时如何获取 ENV 变量

    我想知道如何从 dockerspect 获取环境变量 当我跑步时 docker inspect f Config Env PATH 1e2b8689cf06 我得到以下信息 FATA 0000 template 1 9 executing
  • C++ 中的斑点检测

    我是计算机视觉方面的新手 但我需要在 C 中创建一个小功能 即使他上面印有东西 它也会检测一张白纸 并检索 4 个边缘坐标 这就是我真正需要的 这样我就可以使用这些坐标并剪切另一个 jpg 文件 并将剪切的图像用作 opengl 纹理 我不
  • Mac Sierra 中焦点跟随鼠标(无自动提升)

    我知道有关此主题的其他线程 但它们是基于自动引发的和 或所有答案都指向不再开发的软件 我只是在寻找这个简单的功能 Mac 上焦点跟随鼠标 无需自动提升 Zoooom2 能够执行此操作 但他们不再开发自己的软件 我没有使用终端 需要在具有多个
  • Logstash grok 测试与 rspec 有不同的行为?

    我正在为 grok 过滤器创建一个测试套件 有些日志由logstash 正确丰富 但不是rspec 测试 为了测试这一点 我启动了一个 Logstash 实例 其中包含 stdin stdout 和 json 用于输入和输出 这是示例日志
  • jquery ajax请求跨域时返回状态码0

    我正在尝试发出跨域请求 但服务器无法响应 Access Control Allow Origin 我正在尝试读取响应头 当我尝试读取状态代码或就绪状态时 它返回 0 我的 ajax 请求代码如下 ajax url https account
  • 使用scale_fill_manual手动分配颜色仅适用于某些六边形尺寸

    我正在尝试创建一个由六边形计数箱总结的散点图 我希望用户能够定义色标的计数中断 我有这个工作 使用scale fill manual 但奇怪的是 它只是有时有效 在下面的 MWE 中 使用给定的种子值 如果xbins 10 导致绘图存在以下
  • 在析构函数调用的哪一点,对象不再存在?

    当一个对象的析构函数被调用时 该对象在什么时候不再存在 它是在被调用的那一刻发生的吗 或者在完成删除函数内对象成员的内存之后 我主要问它是为了了解在其析构函数中调用对象的函数是否合法 在析构函数调用的哪一点 对象不再存在 对象的生命周期通过
  • 没有完整堆栈框架的 Symfony 组件

    我在我的项目中使用 Symfony DI Http Kernel Routing 创建您自己的 PHP 框架 https symfony com doc current create framework index html https s
  • 连接两个docker容器

    我有两个容器 第一个带有django第二个是postgresql 好吧 在我的第一个服务器中我运行了django我正在尝试将它与第二个联系起来 第二个容器有端口32770暴露但在端口内部运行5432 在我的本地机器上 我有连接 服务器 本地
  • 如何在 Oracle PLSQL 中透视表?

    我有一个表格如下 KEY 1995 1996 1997 1998 1999 2000 2001 2002 2003 123 0 0 0 461 1188 2049 1056 377 295 我希望数据可见 如下所示 KEY SEQ NBR
  • 即使侧边栏在 SwiftUI 中打开,如何使视图全屏?

    Goal 与地图应用程序一样 当侧边栏打开时 视图显示为全帧大小 视图位于侧边栏下方 我尝试过的 为了最大化视图的大小 我将大小设置为无穷大并添加视图修饰符 ignoresSafeArea 但它仍然不像地图那样全画幅 当我打开侧边栏时 你会
  • Hibernate、Spring 和 MySQL:无法将字符集设置为 UTF-8

    我对 Hibernate 和 Spring 有一个问题 我无法在任何地方使用 UTF 8 字符集 并且我对重音字母有一些问题 例如 这是我的数据库创建的一部分 Dropping and creating database again DRO
  • 将颜色从 CSS 转换为 javafx 颜色对象

    我想知道是否可以转换 CSS 中定义的颜色 例如 root my blue rgb 50 100 200 转换为 JavaFX 中的颜色对象 例如 通过 CSS 定义 我可以在节点上使用 setStyle 来设置其颜色 label1 set
  • Hibernate Validator:将验证限制为给定的约束

    我想分两步执行我的实体的验证 虽然我在保存到数据库之前使用 defaultValidatorFactory 来验证实体的所有字段 但我想在前面的步骤中对实体执行部分验证 但我找不到配置我的验证器 或 validatorFactory 的方法
  • reportlabs 中的 Python 饼图

    我指的是这个链接 http www reportlab com snippets 4 用于生成饼图 在此 每个数据的颜色都是预先定义的 即 10 个数据点有 10 种颜色 如果我有 11 个数据点 那么第 11 个数据点将没有颜色怎么办 我
  • 在Winforms中显示动画gif而不锁定文件

    我正在尝试显示各种文件类型的图像 包括动画 gif文件 在我的 Winforms 应用程序中 我也必须能够修改显示的文件 更改文件名 删除它们 问题是一个Picturebox 锁定图像文件 直到应用程序关闭 http support mic