【问题标题】:BitmapEncoder FlushAsync() never returnsBitmapEncoder FlushAsync() 永远不会返回
【发布时间】:2015-11-24 22:56:03
【问题描述】:

我已经为此搜索了网络,但尚未找到解决方案。我的通用手机应用中有一个 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();
}

任何帮助都会很棒!我已经为此工作了好几个小时,尝试不同的方法让它工作但没有运气。

【问题讨论】:

    标签: windows-phone win-universal-app


    【解决方案1】:

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

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

    不知道为什么 MemoryStream 会导致问题,但这是一个很容易解决的问题!我希望这对其他人有帮助。

    【讨论】:

    • 我也有同样的问题。你能像你的问题一样分享代码sn-p吗?我不明白在哪里使用字节数组。 BitmapEncoder.CreateAsync() 接收字节数组而不是随机访问流没有过载。
    • 抱歉,很久以前了。查看初始代码 sn-p,它看起来像 switch 你有三个更改: 1. 将 AsRandomAccessStream 更改为 .AsInMemoryRandomAccessStream 2. 在“使用”块的末尾插入此代码块和字节数组 3. 只需删除最后的返回(在 using 块之后),因为它不再被使用。这对我来说太久远了,我无法 100% 自信,所以试试吧。
    • 你救了我的命!谢谢!
    • 很高兴它帮助了@demonplus!
    猜你喜欢
    • 2019-11-15
    • 2011-07-25
    • 1970-01-01
    • 2012-10-02
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多