我正在尝试实施一个适用于图像处理的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获取?因为稍后,我打算做一些像素操作。
欢迎任何类型的方法,谢谢。
答案 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
。