无法从手机中选择的照片创建BitmapImage

时间:2013-06-06 12:43:16

标签: windows-phone-7 windows-8 windows-runtime windows-phone-8 windows-phone

我正在尝试实施一个适用于图像处理的Windows Phone 8应用程序,尝试从Windows 8应用程序移植它。但是我一开始就很快陷入困境。

我想要实现的是从手机中选择一些图片并在我的应用中显示,就像他们在相册中看到的一样。为此,我也尝试了一些MVVM技术。但是,当我尝试从文件BitmapImage创建Stream时,我发现错误,说我已超出范围......

这是我的模特:

public class SelectedPhoto : IDisposable
{
    public Stream Data { get; set; }

    public string Name { get; set; }

    public BitmapImage Image { get; set; }

    public SelectedPhoto(string name, Stream data)
    {
        Name = name;

        Data = new MemoryStream();
        data.CopyTo(Data);

        Image = new BitmapImage();
        Image.SetSource(Data); //Here's the Argument Exception. 
    }

    public void Dispose()
    {
        Data.Dispose();
    }
}

所以我在构造函数中得到了异常......我在PhotoChooserTask中的代码中使用了这个:

private void PhotoChooserTaskCompleted(object sender, PhotoResult e)
{
    if (e.TaskResult == TaskResult.OK)
    {
        PhotosViewModel.AddPhoto(new SelectedPhoto(e.OriginalFileName, e.ChosenPhoto));
    }
}

Argument Exception说:偏移量和长度超出了数组的范围,或者计数大于从索引到源集合末尾的元素数量。但是我不是以任何方式操纵Stream,我只是需要它来创建BitmapImage,因为我已经看了一些例子。

在这种情况下,如何从手机获取所选图像文件的BitmapImage?或者更好,我怎样才能直接将其作为WriteableBitmap获取?因为稍后,我打算做一些像素操作。

欢迎任何类型的方法,谢谢。

1 个答案:

答案 0 :(得分:3)

要修复代码,请调用Seek方法返回流的开头:

public SelectedPhoto(string name, Stream data)
{
    Name = name;

    Data = new MemoryStream();
    data.CopyTo(Data);

    Data.Seek(0, SeekOrigin.Begin);

    Image = new BitmapImage();
    Image.SetSource(Data); //Here's the Argument Exception. 
}

那说,为什么要复制流?您可以直接使用data