打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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显示出错。如下图所示:

 

三、问题分析

WinformsPictureBox.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);

        }

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c# GDI 简单绘图(四)
C# 中 PictureBox 加载图片后无法删除解决方法 .
.NET图表:ComponentOne Chart和FlexChart的对比分析(上)
C#编程实现图片的打开、放大、缩小
两款GIF动画生合成器
C#中pictureBox上如何设置label透明
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服