一、问题描述
当我们用方法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显示出错。如下图所示:
三、问题分析
Winforms在PictureBox.Load中,先根据图片的URL创建一个流(Stream),接着调用Image.FromStream载入图片,最后关闭流。
根据Image.FromStream在MSDN的帮助文档,我们必须在图片的生命周期内不能关闭其对应的流。一旦对应的流被关闭,图片就处于不完整的状态,对其进行操作就有可能出问题。如下面这段代码就能捕捉到一个异常:
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);
}
运行上述代码,我们可以正确地载入图片,如下图所示:
分享到:
相关推荐
附件:WeifenLuo.WinFormsUI.Docking3.1.0.rar 包含: WeifenLuo.WinFormsUI.Docking.dll, license.txt ,WeifenLuo.WinFormsUI.Docking.pdb 等三个文件。基于Net4.0; 布局控件"WeifenLuo.WinFormsUI.Docking"是一个...
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 包,NuGet官网速度慢,特别提供下载。
WeifenLuo.WinFormsUI.Docking.dll的源码+示例!支持framwork4 最新版。 没错!是WeifenLuo.WinFormsUI.Docking.dll 的源代码和示例程序! DockPanel Suite是一个国外开源项目。 项目要引用WeifenLuo.WinFormsUI....
vs2010添加WeifenLuo.WinFormsUI.Docking.DockPanel.dll文件后,从工具栏中添加DockPanel控件时报错,提示【类型 Universe 无法解析程序集: System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5...
WeifenLuo.WinFormsUI.Docking.dll 重新编译,支持4.0了 输出选4.0,不要client那个
CefSharp.WinForms.49.0.1使用NuGet程序包管理器无法找到此版本,故使用离线包进行安装,里面附带了我手写的流程和所需到的所有文件。最后安装成功,测试示例通过。
WeifenLuo.WinFormsUI.Docking 的扁平化风格 类似Microsoft Visual Studio 2012 的风格,并且有控件原代码.
weifenluo.WinFormsUI.Docking的c#工程源码及生成的weifenluo.WinFormsUI.Docking.dll,dll可以直接使用,也可以自己按需求修改源码,非常实用。
这是dll文件,直接引用即可 winform开发框架,可以实现像Visual Studio的窗口停靠、拖拽等功能。
WeifenLuo.WinFormsUI.Docking源代码,可用于日常学习
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.ReportViewer.WinForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies....
winfrom框架源代码,C#源代码框架。WeifenLuo.WinFormsUI.Docking源代码 WeifenLuo.WinFormsUI.Docking3.0.2最新源代码
CefSharp.WinForms.79.1.360 + CefSharp.Common.79.1.360 程序包,包含 cef.redistx86和x64版本,nuget用不了的可以直接下载使用,包含其中的dll文件即可
UI for WinForms R2 2016 (version 2016.2.503)May 04, 2016 开发版,无需破解,无需注册。 上传文件大小限制,共3个分卷,注意下载。
WeifenLuo.WinFormsUI.Docking.dll下载
WinFormsUI.Docking.dll和OutlookBar的实例(C#源码)
Spire.BarCode支持包括Bitmap, JPG, PNG, EMF, TIFF, GIF and WMF等众多常用的图片格式。 主要功能: 1.强大的一维、二维条形码识别和生成功能 支持常用的线性条形码,二维条形码,邮政条形码,能从任何方向检测...
资源分类:Python库 所属语言:Python 资源全名:toga-winforms-0.3.0.dev22.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059