BitmapEncoder FlushAsync()永远不会返回

Ari*_*ulp 6 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Ari*_*ulp 12

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

byte[] bytes = new byte[ras.Size];
await ras.AsStream().ReadAsync(bytes, 0, bytes.Length);
return bytes;
Run Code Online (Sandbox Code Playgroud)

不确定为什么MemoryStream导致了它的问题,但这是一个非常简单的修复!我希望这有助于其他人.

  • 抱歉,太久之前了。查看最初的代码片段,看起来 switch 做了三处更改: 1. 将 AsRandomAccessStream 更改为 .AsInMemoryRandomAccessStream 2. 在“using”块的末尾插入带有字节数组的代码块 3. 只需删除最后的 return (在 using 块之后),因为它不再被使用。对我来说,这对我来说太久远了,还不能有 100% 的信心,所以试试吧。 (2认同)