Próbuję utworzyć MediaComposition. Udało mi się połączyć wiele obrazów png w jeden film; jednak utworzone pliki mają czarne tło. Początkowo myślałem, że może to być spowodowane tym, że pliki były plikami png, ale samo zachowanie dotyczy jpgs. Oto, w jaki sposób zapisuję obraz:Dodaj kolor tła do MediaComposition
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;
}
Zapisuje obraz w porządku, ale tło to alfa. Oznacza to, że gdy próbuję połączyć je w kompozycję medialną, nie ma tła, a jest ono czarne. Próbowałem użyć nakładek podczas tworzenia MediaComposition, aby to poprawić:
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);
Ale na próżno. Podejrzewam, że w tym przypadku nie rozumiem znaczenia terminu "nakładka". Moje pytania brzmią: czy można nakładać wideo w czasie kompozycji, a jeśli tak, to w jaki sposób? Ewentualnie, jeśli trzeba to zrobić na obrazie, w jaki sposób mogę zapisać obraz z tłem?
EDYTOWANIE:
Zrobiłem postęp (?) Z tym; następujące kompiluje i działa, ale tworzy solidną czarny obraz:
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:
znalazłem this odpowiedź, która rodzaju rozwiązuje problem przy użyciu biblioteki Win2D; chociaż nie rozwiązuje mojego prawdziwego problemu, pozwala mi to obejść. Mam nadzieję, że istnieje lepsze rozwiązanie.
Nie wiadomo, co próbujesz zrobić. Po prostu zapisz obraz bez tła alfa? –
Zapisz obraz z tłem lub ułóż tło w momencie tworzenia pliku wideo (obecnie korzystasz z MediaComposition). –