Я пытаюсь создать MediaComposition. Мне удалось объединить несколько изображений png в одно видео; однако созданные файлы имеют черный фон. Сначала я думал, что это может быть потому, что файлы были png файлами, но тот же самый bevaviour возникает для 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);
Но безрезультатно. Мое подозрение в том, что я не понимаю смысл термина "наложение" в этом случае. Итак, мои вопросы: возможно ли накладывать видео на время композиции и, если да, то как? Альтернативно, если это нужно сделать в самом изображении, как сохранить изображение с фоном?
EDIT:
Я добился прогресса (?) с этим; следующий компилируется и запускается, но создает сплошное черное изображение:
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();
}
}
EDIT:
Я нашел этот ответ, который решает проблему, используя библиотеку Win2D; хотя это не касается моей актуальной проблемы, это позволяет мне обойти это. Надеюсь, там есть лучшее решение.