`
izuoyan
  • 浏览: 9196818 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Winforms: PictureBox.Load不能载入GIF图片

阅读更多

一、问题描述

当我们用方法PictureBox.Load载入GIF图片时,图片不能正常显示。

二、问题重现

1. Visual Studio中创建一个Winforms工程;

2. Form1上添加一个按钮;

3. button1添加Click事件处理器;

4. 根据GIF的路径,设置相应的URL,并调用PictureBox.Load

private void button1_Click(object sender, EventArgs e)

{

pictureBox1.Load(fileUrl);

}

5. 编译运行,点击button1

我们发现Form1显示出错。如下图所示:

PictureBox.Load载入GIF图片,不能正常显示

三、问题分析

WinformsPictureBox.Load中,先根据图片的URL创建一个流(Stream),接着调用Image.FromStream载入图片,最后关闭流。

根据Image.FromStreamMSDN的帮助文档,我们必须在图片的生命周期内不能关闭其对应的流。一旦对应的流被关闭,图片就处于不完整的状态,对其进行操作就有可能出问题。如下面这段代码就能捕捉到一个异常:

try

{

using (Stream stream = new FileStream(fileName, FileMode.Open))

{

image = Image.FromStream(stream);

}

TextureBrush brush = new TextureBrush(image);

}

catch (Exception e)

{

MessageBox.Show(e.ToString());

}

运行上述代码,我们发现不仅对GIF,而是对所有类型的图片,在关闭对应的流之后创建一个TextureBrush,都会出错抛出异常。

注:此时我们捕捉到的异常是OutOfMemoryException的异常。这个异常看起来和实际问题不是很相关。System.Drawing底层调用GDI+的函数,而GDI+是用C/C++开发的。GDI+在创建Brush的过程中检验一个指针为0,就返回一个OutOfMemory的错误代码,而System.Drawing根据这个错误代码抛出OutOfMemoryException异常。

四、解决方案

Winforms 会在以后的.NET的后续版本中解决这个问题。在.NET解决这个问题之前,开发者可以通过调用其他方法如Image.FromFile。下面是一个示例代码:

private void button1_Click(object sender, EventArgs e)

{

pictureBox1.Image = Image.FromFile(fileName);

}

运行上述代码,我们可以正确地载入图片,如下图所示:

用Image.FromFile载入GIF图片,能正常显示

分享到:
评论

相关推荐

    WeifenLuo.WinFormsUI.Docking3.1.0

    附件:WeifenLuo.WinFormsUI.Docking3.1.0.rar 包含: WeifenLuo.WinFormsUI.Docking.dll, license.txt ,WeifenLuo.WinFormsUI.Docking.pdb 等三个文件。基于Net4.0; 布局控件"WeifenLuo.WinFormsUI.Docking"是一个...

    WeifenLuo.WinFormsUI.Docking.dll 源码+示例 支持framwork4 最新版

    WeifenLuo.WinFormsUI.Docking.dll的源码+示例!支持framwork4 最新版。 没错!是WeifenLuo.WinFormsUI.Docking.dll 的源代码和示例程序! DockPanel Suite是一个国外开源项目。 项目要引用WeifenLuo.WinFormsUI....

    cefsharp.winforms.49.0.1.nupkg

    cefsharp.winforms.49.0.1.nupkg; cefsharp.winforms.49.0.1.nupkg; cefsharp.winforms.49.0.1.nupkg; cefsharp.winforms.49.0.1.nupkg; cefsharp.winforms.49.0.1.nupkg;

    ookii.dialogs.winforms.1.0.0.nupkg

    ookii.dialogs.winforms.1.0.0.nupkg 包,NuGet官网速度慢,特别提供下载。

    WeifenLuo.WinFormsUI.Docking 扁平化风格

    WeifenLuo.WinFormsUI.Docking 是一个开源的.NET Framework库,专门用于在Windows Forms应用程序中实现类似Microsoft Visual Studio 2012的浮动面板和多文档界面(MDI)布局。这个库允许开发者创建高度自定义和灵活...

    VS中NuGet包离线安装CefSharp.WinForms.49.0.1的方法及所需文件(环境VS2010、net4.0)

    在.NET开发环境中,Visual Studio(VS)的NuGet包管理器是用于添加、更新和管理项目依赖库的强大...通过遵循上述步骤,即使在没有网络连接的情况下,也能成功地将CefSharp.WinForms 49.0.1集成到你的WinForms项目中。

    支持framwork4的WeifenLuo.WinFormsUI.Docking.dll

    WeifenLuo.WinFormsUI.Docking.dll 重新编译,支持4.0了 输出选4.0,不要client那个

    WeifenLuo.WinFormsUI.Docking 控件 应用 C# winform

    WeifenLuo.WinFormsUI.Docking 控件应用 C# WeifenLuo.WinFormsUI.Docking 控件是一个强大的界面布局控件,可以保存自定义的布局为 XML 文件,并可以加载 XML 配置文件。下面是关于 WeifenLuo.WinFormsUI.Docking ...

    WeifenLuo.WinFormsUI.Docking

    vs2010添加WeifenLuo.WinFormsUI.Docking.DockPanel.dll文件后,从工具栏中添加DockPanel控件时报错,提示【类型 Universe 无法解析程序集: System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5...

    WeifenLuo.WinFormsUI.Docking源代码

    WeifenLuo.WinFormsUI.Docking 是一个开源的.NET框架组件,专门用于Windows Forms应用程序中的...总之,WeifenLuo.WinFormsUI.Docking是一个宝贵的资源,无论是对于.NET初学者还是经验丰富的开发者,都能从中获益良多。

    Bunifu_UI_WinForms_1.8.0.1_Downloadly.ir.rar

    在本文中,我们将深入探讨 Bunifu UI WinForms库的核心特点、功能以及如何在Delphi项目中集成和使用它。 首先,Bunifu UI WinForms提供了丰富的预定义控件集,包括按钮、滑块、进度条、标签、输入框等,这些控件都...

    weifenluo.winformsui.docking3.1.0,最新版本2021年8月最后更新

    标题 "weifenluo.winformsui.docking3.1.0" 指的是一个针对Windows Forms应用程序的停靠库,由Weifen Luo开发。这个版本是2021年8月的最后更新,更新到了3.1.0,意味着它包含了自上一版本以来的一些错误修复和潜在...

    WeifenLuo.WinFormsUI.Docking源代码 3.0.2最新源代码

    WeifenLuo.WinFormsUI.Docking是一款流行的.NET Framework控件库,专为Windows Forms应用程序提供可停靠的用户界面设计。这个源代码库是C#语言编写的,它允许开发者创建类似Visual Studio那样复杂的布局环境,其中...

    PictureBox控件以圆形显示

    通常情况下,`PictureBox`会以矩形的形式展示图片,但有时我们可能希望图片以圆形的方式呈现,这在设计用户界面时能增加一些视觉效果。本篇文章将详细探讨如何在C#中使用`PictureBox`控件实现图片的圆形显示。 首先...

    WeifenLuo.WinFormsUI.Docking.dll插件.rar

    总的来说,WeifenLuo.WinFormsUI.Docking.dll插件是C# WinForm开发中不可或缺的工具,它提供了一套完整的解决方案来处理复杂的用户界面布局问题,让开发者可以专注于应用的功能实现,而不是界面设计的细节。...

    weifenluo.WinFormsUI.Docking的源码及dll

    标题 "weifenluo.WinFormsUI.Docking的源码及dll" 涉及的是一个针对Windows Forms应用程序的Docking库,由weifenluo开发。这个库提供了在用户界面中实现浮动、停靠窗口功能的组件,使得开发者可以创建类似Visual ...

    Microsoft.ReportViewer.WinForms.dll

    解决这个问题的方法,如描述中所述,是将`Microsoft.ReportViewer.WinForms.dll`文件复制到系统目录`C:\WINDOWS\system32`,这样系统就能在运行时找到这个必要的组件。 `ReportViewer`控件是一个强大的工具,它允许...

    WeifenLuo.WinFormsUI.Docking.dll

    这是dll文件,直接引用即可 winform开发框架,可以实现像Visual Studio的窗口停靠、拖拽等功能。

    WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking.zip

    在.NET框架下,WinForm应用开发是常见的桌面应用程序设计方式,而`WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking.zip`则是一个关于WinForm界面布局的第三方开源框架,它提供了丰富的控件和功能,帮助...

    WeifenLuo.WinFormsUI.Docking 停靠窗口、浮动窗口

    【标题】"WeifenLuo.WinFormsUI.Docking:停靠窗口与浮动窗口技术" 在Windows Forms应用程序开发中,用户界面的灵活性和可定制性是提升用户体验的关键因素之一。WeifenLuo.WinFormsUI.Docking库正是为此目的而设计...

Global site tag (gtag.js) - Google Analytics