UWP显示来自外部路径的图像吗?

时间:2019-02-19 02:46:39

标签: uwp

我正在尝试将简单的WPF程序移植到UWP。它是用于将一些自定义图像分析例程应用于一堆图像的工具。

基本功能:

  1. 将图片添加到图库视图中(可以是100,000张图片)
  2. 对图像进行分析
  3. 导出数据

我遇到的问题是在图库中显示图像。

在WPF中,我可以像ListBox般将ObservableCollection绑定到InputImage的{​​{1}}

<Image Source={Binding Image, IsAsync=True} />

UWP中的等效项是什么?

  • 我已经尝试了上述方法(减去public class InputImage { public string Path { get; set; } public BitmapImage Source { get { var image = new BitmapImage(new Uri(Path, UriKind.Absolute)); image.Freeze(); return image; } } } IsAsync部分),但是图像的宽度和高度均为0。
  • 我想也许我将不得不从路径创建一个Freeze,打开它并设置位图源,但是我不能在属性getter中使用StorageFile方法... li>

有解决方案吗?

注意:我在appxmanifest中启用了broadFileSystemAccess”,并在设置->隐私->文件系统中为该应用打开了

1 个答案:

答案 0 :(得分:2)

解决了,这是我学到的东西:

即使启用了broadFileSystemAccess,似乎也必须通过StorageFile访问外部文件。例如

StorageFile file = await StorageFile.GetFileFromPathAsync(@"C:\path\to\file");

您可以实例化BitmapImage属性,并在首次加载图像列表时直接绑定到该属性,例如

BitmapImage image = new BitmapImage();
var storageFile = await StorageFile.GetFileFromPathAsync(path);
using (IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read))
{
    await image.SetSourceAsync(stream);
}
InputImage.Source = image;

这对于单个图像来说很好,但是对于1000幅图像来说,这是一个问题-即使加载了GridView和其他控件的虚拟化效果,每个图像的加载也会占用大量的时间和内存。

解决方案是使用Stephen Cleary's blog中所述的异步绑定(是的,这似乎确实可行)。

程序:

安装Nito.AsyncEx NuGet软件包。

对该属性使用以下内容:

    public INotifyTaskCompletion<BitmapImage> ImageAsync
    {
        get { return NotifyTaskCompletion.Create(GetImageAsync()); }
    }

    public async Task<BitmapImage> GetImageAsync()
    {
        BitmapImage image = new BitmapImage();
        var storageFile = await StorageFile.GetFileFromPathAsync(Path);
        using (IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read))
        {
            await image.SetSourceAsync(stream);
        }
        return image;
    }

然后根据此任务绑定图像,注意使用Binding而不是x:Bind

<Image Source="{Binding ImageAsync.Result}"/>