C# 应用程序无法可视化600多个图像
我编写了一个WPF应用程序,可以在一大组图像(平均大小600+,190Kb)之间进行交换(fast),但我发现了一些困难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();
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;
}
}