将IRandomAccessStreamWithContentType转换为Byte[]

本文关键字:Byte IRandomAccessStreamWithContentType 转换 | 更新日期: 2023-09-27 18:03:18

在我的应用程序中,我允许用户使用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);

My Byte[]不为空(大约10000字节)

但是当我使用我的转换器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
}

将IRandomAccessStreamWithContentType转换为Byte[]

我很确定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属性中,我调用了async方法来创建位图:

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