我正在尝试创建一个MediaComposition。我已经成功地将多个PNG图像合并成一个视频,但是创建的文件具有黑色背景。起初,我以为这可能是因为文件是PNG文件,但对于JPG文件,相同的情况也发生了。以下是我保存图像的方式:
public async Task<bool> Save(InkCanvas canvas, StorageFile file)
{
if (canvas != null && canvas.InkPresenter.StrokeContainer.GetStrokes().Count > 0)
{
if (file != null)
{
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
await canvas.InkPresenter.StrokeContainer.SaveAsync(stream);
}
}
Clear(canvas);
return true;
}
return false;
}
它可以保存图像,但背景是透明的。这意味着当我尝试将它们链接到媒体组合中时,没有背景,并且呈现为黑色。我尝试在创建MediaComposition时使用叠加来纠正这个问题:
MediaClip overlayVideoClip = MediaClip.CreateFromColor(Colors.White, new TimeSpan(0, 1, 0));
MediaOverlay mo = new MediaOverlay(overlayVideoClip);
MediaOverlayLayer mol = new MediaOverlayLayer();
mol.Overlays.Add(mo);
composition.OverlayLayers.Add(mol);
但是没有效果。我怀疑我在这种情况下误解了叠加层的意思。我的问题是:是否有可能在合成时叠加视频?如果可以,如何操作?或者,如果需要在图像本身中完成,则如何保存带有背景的图像?
编辑:
我在这方面取得了一些进展(?);以下代码可以编译并运行,但创建了一个纯黑色图像:
public async Task TestSave(InkCanvas canvas, StorageFile file)
{
RenderTargetBitmap rtb =
new RenderTargetBitmap();
PixelFormats.Pbgra32);
await rtb.RenderAsync(canvas);
var pixelBuffer = await rtb.GetPixelsAsync();
using (IRandomAccessStream stream =
await file.OpenAsync(FileAccessMode.ReadWrite))
{
BitmapEncoder encoder =
await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Straight,
(uint)rtb.PixelWidth,
(uint)rtb.PixelHeight,
96d, 96d,
pixelBuffer.ToArray());
await encoder.FlushAsync();
}
}
编辑:
我发现这个答案,它通过使用Win2D库来解决问题; 虽然它没有解决我的实际问题,但它让我绕开了它。 希望有更好的解决方案。