Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将IRandomAccessStreamWithContentType转换为字节[]_C#_Windows Runtime - Fatal编程技术网

C# 将IRandomAccessStreamWithContentType转换为字节[]

C# 将IRandomAccessStreamWithContentType转换为字节[],c#,windows-runtime,C#,Windows Runtime,在我的应用程序中,我允许用户使用ContactPicker从contact添加联系人 我尝试将IrandoMacAccessStreamWithContentType转换为Byte[] IRandomAccessStreamWithContentType stream = await contactInformation.GetThumbnailAsync(); if (stream != null && stream.Size > 0) { Byte[] byte

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

我尝试将IrandoMacAccessStreamWithContentType转换为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;
}
如果有人知道问题出在哪里

提前谢谢。 新克里普特

编辑:我已经在另一个项目中使用了我的转换器,它工作得很好。 主要区别在于流的来源不同:

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
}

我很确定
字节
在你的例子中只包含零。您应该修改您的阅读代码:

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
内部使用。在我更改了
convertor和omaccessstream
后,位图按预期创建,没有任何其他修改(所需的
wait
除外):


谢谢你的回答。字节不为空,但不显示图片。我已经在另一个项目中使用了我的转换器,它工作得很好。不同之处在于字节数组是按照问题中的描述得到的。@NeoKript我终于得到了位图创建代码。不过,我不得不避免使用转换器。无论如何,这是一种更好的做法,因为您可以确定,
位图
只会创建一次。我会按照您的描述更改代码。现在很好用。谢谢。向你问好,新克里普
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;
}
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;
    }
}