2013-03-10 140 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