2013-03-10 55 views
3

在我的应用程序中,我允许用户使用ContactPicker添加联系人。将IRandomAccessStreamWithContentType转换为字节[]

我尝试转换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字节)

但是,当我用我的转换字节[]到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 
} 

回答

7

我敢肯定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<IRandomAccessStream> 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; 
    } 
} 
+0

感谢您的回答。 字节不为空,但图片不显示。 我已经在另一个项目中使用了我的转换器,它工作的很好。 不同之处在于字节数组是按照问题描述得到的。 – Geotinc 2013-03-11 17:51:47

+0

@NeoKript我终于得到了位图创建代码的工作。不过,我必须避免使用转换器。无论如何,这是一个更好的做法,因为您可以肯定,“Bitmap”只会创建一次。 – 2013-03-12 06:07:50

+0

我按照您的描述更改我的代码。现在它工作正常。 非常感谢。最好的问候, NeoKript – Geotinc 2013-03-12 20:22:15