将IRandomAccessStreamWithContentType转换为Byte

在我的应用程序中,我允许用户使用ContactPicker从联系人中添加人员。

我尝试将IRandomAccessStreamWithContentType转换为Byte []

IRandomAccessStreamWithContentType stream = await contactInformation.GetThumbnailAsync(); if (stream != null && stream.Size > 0) { Byte[] bytes = new Byte[stream.Size]; await stream.ReadAsync(bytes.AsBuffer(), (uint)stream.Size, Windows.Storage.Streams.InputStreamOptions.None); 

我的字节[]不为空(约10000字节)

但是当我使用Converter Byte []到ImageSource时,BitmapImage的宽度和高度为0。

我将这个转换器用于另一个应用程序,它工作得很好……

 public object Convert(object value, Type targetType, object parameter, string language) { try { Byte[] bytes = (Byte[])value; if (bytes == null) return (new BitmapImage(new Uri((String)parameter))); BitmapImage bitmapImage = new BitmapImage(); IRandomAccessStream stream = this.ConvertToRandomAccessStream(new MemoryStream(bytes)); bitmapImage.SetSource(stream); return (bitmapImage); } catch { return (new BitmapImage(new Uri((String)parameter))); } } private IRandomAccessStream ConvertToRandomAccessStream(MemoryStream memoryStream) { var randomAccessStream = new InMemoryRandomAccessStream(); var outputStream = randomAccessStream.GetOutputStreamAt(0); outputStream.AsStreamForWrite().Write(memoryStream.ToArray(), 0, (Int32)memoryStream.Length); return randomAccessStream; } 

如果有人知道问题是什么……

提前致谢。 NeoKript

编辑:我已经将我的转换器用于另一个项目,它运行良好。 主要区别在于流的起源不同:

 var reader = await file.OpenReadAsync(); using (DataReader dataReader = new DataReader(reader)) { var bytes = new byte[reader.Size]; await dataReader.LoadAsync((uint)reader.Size); dataReader.ReadBytes(bytes); // Use of bytes } 

我非常确定你的案例中的bytes只包含零。 你应该修改你的阅读代码:

 var buffer = await stream.ReadAsync(bytes.AsBuffer(), (uint)stream.Size, InputStreamOptions.None); bytes = buffer.ToArray(); 

或者甚至更好,完全避免IBuffer

 await stream.AsStream().ReadAsync(bytes, 0, bytes.Length); 

在这两种情况下,字节数组现在都包含实际值。 我仍然无法让你的转换器工作,我现在没有时间进一步排除故障。 也许其他人会帮助你。

编辑:

我不确定你是否在另一个项目中使用转换器但是如果不使用异步方法就无法使用它,这使得无法在IValueConverter使用。 在我更改了ConvertToRandomAccessStream之后,按预期创建了位图而没有任何其他修改(除了所需的await ):

 private async Task ConvertToRandomAccessStream(byte[] bytes) { var randomAccessStream = new InMemoryRandomAccessStream(); using (var writer = new DataWriter(randomAccessStream)) { writer.WriteBytes(bytes); await writer.StoreAsync(); await writer.FlushAsync(); writer.DetachStream(); } randomAccessStream.Seek(0); return randomAccessStream; } 

我没有使用转换器,而是在视图模型中添加了一个返回位图的属性。 在bytes属性中,我调用了用于创建位图的异步方法:

 public Byte[] ImageBytes { get { return _imageBytes; } set { if (Equals(value, _imageBytes)) return; _imageBytes = value; OnPropertyChanged(); CreateBitmap(); } } public BitmapSource Image { get { return _image; } set { if (Equals(value, _image)) return; _image = value; OnPropertyChanged(); } } private async Task CreateBitmap() { try { BitmapImage bitmapImage = new BitmapImage(); IRandomAccessStream stream = await this.ConvertToRandomAccessStream(ImageBytes); bitmapImage.SetSource(stream); Image = bitmapImage; } catch { Image = null; } }