MediaComposition を作成しようとしています。複数の png 画像を 1 つのビデオに結合することに成功しました。ただし、作成されたファイルの背景は黒です。最初は、ファイルが 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ライブラリを使用して問題を解決するこの回答を見つけました。それは私の実際の問題に対処するものではありませんが、それを回避できます。うまくいけば、そこにはより良い解決策があります。