BitmapEncoder FlushAsync()永远不会返回

时间:2015-11-24 22:56:04

标签: windows-phone win-universal-app

我已经在网上搜索了这个并没有找到解决方案。我的通用手机应用程序中有 DispatchTimer 。在每个刻度线上,我想捕获屏幕的一部分并将其保存为JPEG。我的代码看起来非常简单,并且没有崩溃 - 它根本不会从 FlushAsync ()返回。看起来它必定是一个死锁场景,但我还没能找到冲突的位置:

using (var ms = new MemoryStream())
{
    var renderTargetBitmap = new RenderTargetBitmap();
    await renderTargetBitmap.RenderAsync(ctrl);
    var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();

    using (var ras = ms.AsRandomAccessStream())
    {
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, ras, propertySet);

        encoder.SetPixelData(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Premultiplied,
            (uint) renderTargetBitmap.PixelWidth,
            (uint) renderTargetBitmap.PixelHeight,
            logicalDpi, logicalDpi,
            pixelBuffer.ToArray());

        await encoder.FlushAsync();
    }

    return ms.ToArray();
}

任何帮助都会很棒!我已经在这几个小时了,尝试了不同的方法让它运转起来没有运气。

1 个答案:

答案 0 :(得分:10)

我明白了!事实证明,您不能仅使用MemoryStream.AsRandomAccessStream()作为编码器目的地。事实证明你应该只使用 InMemoryRandomAccessStream ,然后获取字节:

byte[] bytes = new byte[ras.Size];
await ras.AsStream().ReadAsync(bytes, 0, bytes.Length);
return bytes;

不确定为什么MemoryStream会导致问题,但这是一个非常简单的解决方法!我希望这有助于其他人。