Я пытаюсь создать 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; хотя это не решает мою настоящую проблему, это позволяет мне обойти ее. Надеюсь, есть лучшее решение.