C# 将RenderTargetBitmap转换为BitmapImage

C# 将RenderTargetBitmap转换为BitmapImage,c#,xaml,windows-runtime,bitmapimage,rendertargetbitmap,C#,Xaml,Windows Runtime,Bitmapimage,Rendertargetbitmap,如何在C#XAML、Windows 8.1中将RenderTargetBitmap转换为BitmapImage 我试过了 // rendered is the RenderTargetBitmap BitmapImage img = new BitmapImage(); InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); await randomAccessStream.WriteA

如何在C#XAML、Windows 8.1中将RenderTargetBitmap转换为BitmapImage

我试过了

// rendered is the RenderTargetBitmap 
BitmapImage img = new BitmapImage();
InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
await randomAccessStream.WriteAsync(await rendered.GetPixelsAsync());
randomAccessStream.Seek(0); 
await img.SetSourceAsync(randomAccessStream);
但它总是在某一时刻出错

img.SetSourceAsync(randomAccessStream);
在WPF中有很多方法,但在WinRT中?我该怎么做

非常感谢

您是否尝试过以下方法:

  var bitmap = new  RenderTargetBitmap();

  await bitmap.RenderAsync(elementToRender);

  image.Source = bitmap;
参考:

更新:

另一个裁判。。可能有助于:

更新2:

试试这个:

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray)
    {
        var bitmapImage = new BitmapImage();

        var stream = new InMemoryRandomAccessStream();
        await stream.WriteAsync(byteArray.AsBuffer());
        stream.Seek(0);

        bitmapImage.SetSource(stream);
        return bitmapImage;
    }
专用异步任务ByteArrayToBitmapImage(字节[]byteArray)
{
var bitmapImage=新的bitmapImage();
var stream=新的InMemoryRandomAccessStream();
wait stream.WriteAsync(byteArray.AsBuffer());
stream.Seek(0);
bitmapImage.SetSource(流);
返回位图图像;
}
参考:

您是否尝试过以下方法:

  var bitmap = new  RenderTargetBitmap();

  await bitmap.RenderAsync(elementToRender);

  image.Source = bitmap;
参考:

更新:

另一个裁判。。可能有助于:

更新2:

试试这个:

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray)
    {
        var bitmapImage = new BitmapImage();

        var stream = new InMemoryRandomAccessStream();
        await stream.WriteAsync(byteArray.AsBuffer());
        stream.Seek(0);

        bitmapImage.SetSource(stream);
        return bitmapImage;
    }
专用异步任务ByteArrayToBitmapImage(字节[]byteArray)
{
var bitmapImage=新的bitmapImage();
var stream=新的InMemoryRandomAccessStream();
wait stream.WriteAsync(byteArray.AsBuffer());
stream.Seek(0);
bitmapImage.SetSource(流);
返回位图图像;
}
参考:

您是否尝试过以下方法:

  var bitmap = new  RenderTargetBitmap();

  await bitmap.RenderAsync(elementToRender);

  image.Source = bitmap;
参考:

更新:

另一个裁判。。可能有助于:

更新2:

试试这个:

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray)
    {
        var bitmapImage = new BitmapImage();

        var stream = new InMemoryRandomAccessStream();
        await stream.WriteAsync(byteArray.AsBuffer());
        stream.Seek(0);

        bitmapImage.SetSource(stream);
        return bitmapImage;
    }
专用异步任务ByteArrayToBitmapImage(字节[]byteArray)
{
var bitmapImage=新的bitmapImage();
var stream=新的InMemoryRandomAccessStream();
wait stream.WriteAsync(byteArray.AsBuffer());
stream.Seek(0);
bitmapImage.SetSource(流);
返回位图图像;
}
参考:

您是否尝试过以下方法:

  var bitmap = new  RenderTargetBitmap();

  await bitmap.RenderAsync(elementToRender);

  image.Source = bitmap;
参考:

更新:

另一个裁判。。可能有助于:

更新2:

试试这个:

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray)
    {
        var bitmapImage = new BitmapImage();

        var stream = new InMemoryRandomAccessStream();
        await stream.WriteAsync(byteArray.AsBuffer());
        stream.Seek(0);

        bitmapImage.SetSource(stream);
        return bitmapImage;
    }
专用异步任务ByteArrayToBitmapImage(字节[]byteArray)
{
var bitmapImage=新的bitmapImage();
var stream=新的InMemoryRandomAccessStream();
wait stream.WriteAsync(byteArray.AsBuffer());
stream.Seek(0);
bitmapImage.SetSource(流);
返回位图图像;
}

参考:

这是一个有效的

事实证明,我不能直接使用

stream.WriteAsync(byteArray.AsBuffer());
您必须使用位图编码器,最终工作代码:

InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream();
        var buffer = await rendered.GetPixelsAsync();
      //  await stream.ReadAsync(buffer, (uint)buffer.Length, InputStreamOptions.None);
        BitmapImage img = new BitmapImage();
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
        encoder.SetPixelData(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Straight,
            (uint)rendered.PixelWidth,
            (uint)rendered.PixelHeight,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            buffer.ToArray());
        await encoder.FlushAsync();
        await img.SetSourceAsync(stream);
        preview.Source = img;

这是一个有效的

事实证明,我不能直接使用

stream.WriteAsync(byteArray.AsBuffer());
您必须使用位图编码器,最终工作代码:

InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream();
        var buffer = await rendered.GetPixelsAsync();
      //  await stream.ReadAsync(buffer, (uint)buffer.Length, InputStreamOptions.None);
        BitmapImage img = new BitmapImage();
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
        encoder.SetPixelData(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Straight,
            (uint)rendered.PixelWidth,
            (uint)rendered.PixelHeight,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            buffer.ToArray());
        await encoder.FlushAsync();
        await img.SetSourceAsync(stream);
        preview.Source = img;

这是一个有效的

事实证明,我不能直接使用

stream.WriteAsync(byteArray.AsBuffer());
您必须使用位图编码器,最终工作代码:

InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream();
        var buffer = await rendered.GetPixelsAsync();
      //  await stream.ReadAsync(buffer, (uint)buffer.Length, InputStreamOptions.None);
        BitmapImage img = new BitmapImage();
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
        encoder.SetPixelData(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Straight,
            (uint)rendered.PixelWidth,
            (uint)rendered.PixelHeight,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            buffer.ToArray());
        await encoder.FlushAsync();
        await img.SetSourceAsync(stream);
        preview.Source = img;

这是一个有效的

事实证明,我不能直接使用

stream.WriteAsync(byteArray.AsBuffer());
您必须使用位图编码器,最终工作代码:

InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream();
        var buffer = await rendered.GetPixelsAsync();
      //  await stream.ReadAsync(buffer, (uint)buffer.Length, InputStreamOptions.None);
        BitmapImage img = new BitmapImage();
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
        encoder.SetPixelData(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Straight,
            (uint)rendered.PixelWidth,
            (uint)rendered.PixelHeight,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            buffer.ToArray());
        await encoder.FlushAsync();
        await img.SetSourceAsync(stream);
        preview.Source = img;

都德,谢谢,是的,但我只想要randomAccessStream,它总是崩溃或任何类型的流:D我只需要字节或流,我可以稍后使用它创建另一个BitMapImages错误消息或异常类型是什么?有截图吗。。答案更新了详细信息“在windows phone 8.1中共享渲染到位图图像”的帖子是有效的,结果证明我必须使用位图编码器填充流,而不是直接从流中填充。WriteAsync(缓冲区);非常感谢您的帮助:)都德谢谢,是的,但我只想要randomAccessStream,它总是崩溃或任何类型的流:D我只需要字节或流,我可以稍后使用它创建另一个BitMapImages错误消息或异常类型是什么?有截图吗。。答案更新了详细信息“在windows phone 8.1中共享渲染到位图图像”的帖子是有效的,结果证明我必须使用位图编码器填充流,而不是直接从流中填充。WriteAsync(缓冲区);非常感谢您的帮助:)都德谢谢,是的,但我只想要randomAccessStream,它总是崩溃或任何类型的流:D我只需要字节或流,我可以稍后使用它创建另一个BitMapImages错误消息或异常类型是什么?有截图吗。。答案更新了详细信息“在windows phone 8.1中共享渲染到位图图像”的帖子是有效的,结果证明我必须使用位图编码器填充流,而不是直接从流中填充。WriteAsync(缓冲区);非常感谢您的帮助:)都德谢谢,是的,但我只想要randomAccessStream,它总是崩溃或任何类型的流:D我只需要字节或流,我可以稍后使用它创建另一个BitMapImages错误消息或异常类型是什么?有截图吗。。答案更新了详细信息“在windows phone 8.1中共享渲染到位图图像”的帖子是有效的,结果证明我必须使用位图编码器填充流,而不是直接从流中填充。WriteAsync(缓冲区);非常感谢您的帮助:)