【问题标题】:Loading animated GIF in C#在 C# 中加载动画 GIF
【发布时间】:2013-08-04 17:45:54
【问题描述】:

我使用 Adob​​e Flash CS3 创建了一个简单的动画 GIF,该 GIF 包含 200 帧 (1280x786)。当我加载它以在 C# WPF 应用程序中显示时,程序在以下代码中获得 OutofMemoryException

private void set_gif_Image(String path)
    {
        if (File.Exists(path))
        {
            var bitmapimage = new BitmapImage();

            bitmapimage.BeginInit();
            bitmapimage.UriSource = new Uri(path);
            bitmapimage.EndInit();
            ImageBehavior.SetAnimatedSource(img_preview, bitmapimage);//Exception Here
        }
        else
        {
            var bitmapimage = new BitmapImage();

            bitmapimage.BeginInit();
            bitmapimage.UriSource = new Uri("C:\\testing_files\\ERROR.gif");
            bitmapimage.EndInit();

            ImageBehavior.SetAnimatedSource(img_preview, bitmapimage);
        }

但是,例如,如果我加载 20 帧 GIF,则程序加载正常。请注意以下情况:

  • 1280x768 200 帧:例外
  • 550x400 200 帧:加载正常
  • 1280x768 50 帧:加载正常

问题出在哪里?这么大的动图怎么加载无异常?

【问题讨论】:

  • 我希望这篇 SO 帖子可以帮助到你。 stackoverflow.com/questions/210922/…
  • 最好假设异常是准确的。对于 32 位进程而言,消耗 786 MB 内存肯定处于危险区域的深处。您需要一个 64 位进程才能取得成功。将 EXE 项目的平台目标设置更改为 AnyCPU。需要 64 位版本的 Windows。
  • 我已经有一个 64 位系统(intel core i7, 6GB of RAM):|

标签: c# wpf gif


【解决方案1】:

或者你可以在 Release 模式下运行它...不应该被 OutOfMemoryException 困扰...

我建议您稍微调整一下 GIF 的大小,因为 200fps 1280x768 位图代表着大量的内存...

让我们看看... 1 帧代表 983040 像素... (1280 x 768),每个像素由 3 种颜色的数据组成,因此 3 字节等于:3 * 983040 = 2949120 字节仅用于一帧... 你有 200 个……所以:589824000 字节。 这等于 576000 kBytes 或 562.7 MBytes...

这太可怕了……

【讨论】:

  • 不要忘记 alpha 值。每个像素占用 4 个字节。总共 786432000 字节或 750 MB,正如 Hans Passant 已经在他对该问题的评论中所写的那样。以及在 Release 模式下运行如何防止应用程序内存不足?
  • 是的,我不确定位图是否具有 alpha 值表示。好久没用了在发布模式下运行它会留下“调试保留”内存并使用任何可用的内存。我有一个应用程序在调试模式下使用 1.5GB 内存时抛出 OOMException。一旦我将它置于发布模式,它就会占用可用内存并在没有任何警告的情况下增长到 6GB,并且完成了它的工作(撇开使用 6GB 内存不好,因为我后来放弃了这种方法)。
  • 即使在发布模式下,我仍然遇到同样的问题:|我只是不知道 6 GB RAM 机器上的内存不足在哪里:|
  • 我认为我正在使用的库有问题,1024x768 在发布模式配置上工作正常。我听说有些软件开发人员会创建自定义 Flash 动画并将其用作动画 GIF,用于具有更多帧数的应用程序,并且应用程序运行良好。还有其他加载动画 GIF 的方法吗?
猜你喜欢
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 2013-11-13
  • 2012-05-24
  • 1970-01-01
  • 2016-02-21
  • 2014-01-25
  • 2012-01-30
相关资源
最近更新 更多