我已经在网上搜索了这个并没有找到解决方案。我的通用手机应用程序中有 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();
}
任何帮助都会很棒!我已经在这几个小时了,尝试了不同的方法让它运转起来没有运气。
答案 0 :(得分:10)
我明白了!事实证明,您不能仅使用MemoryStream.AsRandomAccessStream()作为编码器目的地。事实证明你应该只使用 InMemoryRandomAccessStream ,然后获取字节:
byte[] bytes = new byte[ras.Size];
await ras.AsStream().ReadAsync(bytes, 0, bytes.Length);
return bytes;
不确定为什么MemoryStream会导致问题,但这是一个非常简单的解决方法!我希望这有助于其他人。