【问题标题】:Cannot create BitmapImage from a chosen photo from phone无法从手机中选择的照片创建 BitmapImage
【发布时间】:2013-06-06 20:59:32
【问题描述】:

我正在尝试实现一个适用于图像处理的 Windows Phone 8 应用程序,并尝试将其从 Windows 8 应用程序移植。但一开始我很快就卡住了。

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

这是我的模型:

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));
    }
}

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

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

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

【问题讨论】:

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


    【解决方案1】:

    要修复您的代码,请调用 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

    【讨论】:

    • 所以 Stream Seek 是问题所在......我很傻,我删除了流副本,现在它似乎工作正常,谢谢!
    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多