Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序无法可视化600多个图像_C#_.net_Wpf_Image_Canvas - Fatal编程技术网

C# 应用程序无法可视化600多个图像

C# 应用程序无法可视化600多个图像,c#,.net,wpf,image,canvas,C#,.net,Wpf,Image,Canvas,我编写了一个WPF应用程序,可以在一大组图像(平均大小600+,190Kb)之间进行交换(fast),但我发现了一些困难 private int appendImages(Canvas c, int start, int end) { int tot = 0; for (int i = start; i < end; i++) { BitmapImage bi = new BitmapImage();

我编写了一个WPF应用程序,可以在一大组图像(平均大小600+,190Kb)之间进行交换(fast),但我发现了一些困难

    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++;
        }
   }
…然后应用程序显示前200/300个图像(取决于我使用的源),其他图像只是空的/空白的(我可以看到下面的画布)

我怀疑是内存问题,但我不确定是什么原因造成的

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

任何帮助都将不胜感激,因为我找不到任何有用的东西。
提前谢谢

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

粗略的信封背面计算,假设640x480图像,24bpp为本机GDI+格式,显示一次加载所有图像的速度略高于2gb,当然,这会随着图像大小呈指数增长


我要做的是,只有一个图像。将实际图像加载代码移动到
changeMageTo
函数中,根据
n
构建文件名,并将加载的图像设置为此处的图像

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

粗略的信封背面计算,假设640x480图像,24bpp为本机GDI+格式,显示一次加载所有图像的速度略高于2gb,当然,这会随着图像大小呈指数增长


我要做的是,只有一个图像。将实际图像加载代码移动到
changeMageTo
函数中,根据
n
构建文件名,并将加载的图像设置为此处的图像

你好,马特,谢谢你的回复。我忘了提到(现在编辑了这个问题)我正在使用WPF,每个JPG的大致大小约为190Kb。我尝试只使用一个图像,并在MouseMove上更改其来源(这就是触发交换的原因),但速度太慢,无法正常工作。。我想你的解决方案也差不多,但我正在尝试,以防万一。。(:我不得不承认,它要么更快,要么我在以前的尝试中犯了一些错误。无论如何,你的解决方案效果很好(即使比我希望的慢了一点),所以再次感谢!!(:嗨,马特,谢谢你的回答。我忘了提(现在编辑了问题)我正在使用WPF,每个JPG的大致大小约为190Kb。我尝试只使用一个图像,并在MouseMove上更改其来源(这就是触发交换的原因),但速度太慢,无法正常工作。我想您的解决方案几乎相同,但我正在尝试,以防万一。。(:我必须承认,它要么更快,要么我在以前的尝试中犯了一些错误。无论如何,您的解决方案效果很好(即使比我希望的慢了一点),所以再次感谢!!(:
    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;
        }
    }