应用程序无法可视化超过600个图像

时间:2013-06-13 16:13:57

标签: c# .net wpf image canvas

我写了一个WPF应用,应该在一大组图像(600 +,190Kb平均大小)之间交换(快速),但我发现了一些困难。

    private int appendImages(Canvas c, int start, int end)
    {
        int tot = 0;
        for (int i = start; i < end; i++)
        {
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            //bi.CacheOption = BitmapCacheOption.OnLoad;
            bi.UriSource = new Uri(appFolder+@"/"+imgFolder+"/"+filename(i)+".jpg");
            bi.EndInit();

            Image img = new Image
            {
                Width = imgWidth,
                Height = imgHeight,
                Source = bi,
                Name = name(i),
                Visibility = i == startImg ? Visibility.Visible : Visibility.Hidden
            };

            c.Children.Add(img);
            tot++;
        }
   }

显然,inizialization很好,但如果我试图像这样交换图像:

    private void changeImageTo(int n)
    {
        Image img = findImage(n);
        Image old = findImage(prevImg);
        if (img != null)
        {
            img.Visibility = Visibility.Visible;
            if (old != null && old != img)
                old.Visibility = Visibility.Hidden;

            prevImg = n;
        }
    }

..然后该应用程序显示第一个200/300图像(取决于我使用的来源),其他只是空/空白(我可以看到下面的画布)。

我怀疑这是一个记忆问题,但我不确定是什么导致它。

顺便说一句,如果我取消注释注释行(BitmapCacheOption.OnLoad),有时我在启动应用程序时会出现vshost错误。

任何帮助都会受到很多赞赏,因为我找不到任何有用的浏览方式。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

看起来您正在一次加载所有图像,并将它们放入WinForms / WPF控件中。对于许多图像来说,这是一个非常糟糕的想法,因为每个图像都会占用资源,即使它没有显示出来。

粗略的信封计算,假设640x480图像,24bpp是原生GDI +格式,显示一次超过2gb用于加载所有图像,当然,这将随着图像大小呈指数增长。

我要做的是,只有一张图片。将实际图像加载代码移动到changeImageTo函数中,根据n构建文件名,然后将加载的图像设置为图像。