1

为了使用我的 Silverlight 应用程序从文件夹中读取图片,我使用文件流设置位图图像的源。请看下面的代码:

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Images", String.Format("{0}.jpg", _imageName));
if (File.Exists(path))
{
    Image = new BitmapImage();
    Image.SetSource(new MemoryStream(File.ReadAllBytes(path)));
}

问题是图像需要很长时间才能显示出来,当我加载大量图片(>400)时,可能会出现内存不足错误。通过 URI 加载图片时,我从来没有遇到过这个错误,我想知道是否可以通过 URI 从路径加载它。我试过的代码:

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Images", String.Format("{0}.jpg", _imageName));
if (File.Exists(path))
{
    Image = new BitmapImage()
                {
                    UriSource = new Uri(path),
                    CreateOptions = BitmapCreateOptions.DelayCreation
                };
}

你有什么提示可以提供吗?

谢谢!

菲利普

4

3 回答 3

0

我的猜测是您正在从本地文件系统加载照片,其分辨率比您通过 URL 加载的图像高得多。

你想加载 400 个,是的,你会用完内存。

对于加载时间,您无能为力。您可以通过使用 aWriteableBitmap缩小实际位图来减少内存压力。

于 2011-11-27T23:55:48.583 回答
0

将图像加载到您的属性中,调整其大小并将该图像设置为预览,然后从文件夹中处理图像并移至下一个。

所以简而言之,您应该在该文件夹中创建图像的缩略图并在您的应用程序中显示它们。

您现在要做的就是将所有图像保留在内存中,即所有大图像,这就是您出现内存不足异常的原因。

于 2011-11-28T09:36:23.060 回答
0

我意识到,即使我通过 URI 加载图片,也不会加载每张图片。该软件在占用 1.6gig 的 ram(共 6gig)时停止加载图片。通过流加载图片的不同之处在于似乎没有针对内存不足的保护。

由于我没有显示所有图像(我意识到正确加载时我有超过 8000 张图片)我只在内存中加载我需要显示的图像。

所以每次我想要一张图片时,我都会从硬盘中加载它。当图片不再显示时,垃圾收集器将它们清除。这样,应用程序的内存始终稳定在 300 兆左右。

于 2011-12-01T01:22:50.377 回答