C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – 将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(),(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
}

解决方法

我非常确定你的案例中的字节只包含零.你应该修改你的阅读代码

var buffer = await stream.ReadAsync(bytes.AsBuffer(),InputStreamOptions.NonE);
bytes = buffer.ToArray();

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

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

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

编辑:

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

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

大佬总结

以上是大佬教程为你收集整理的c# – 将IRandomAccessStreamWithContentType转换为Byte []全部内容,希望文章能够帮你解决c# – 将IRandomAccessStreamWithContentType转换为Byte []所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。