c# – 将背景颜色添加到MediaComposition

我正在尝试创建一个MediaComposition.我已经成功地将多个图像组合成一个视频;但是,创建的文件具有黑色背景.起初我以为这可能是因为这些文件是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;
}

它保存图像很好,但背景是alpha.这意味着当我尝试将它们链接在一起成为媒体作品时,没有背景,它呈现为黑色.在创建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,pixelBuffer.ToArray());

            await encoder.FlushAsync();                
        }
    }

编辑:

我发现this的答案,哪种解决了使用Win2D库的问题;虽然它没有解决我的实际问题,但它让我放松了.希望有一个更好的解决方案.

解决方法

我唯一理解的是您正在尝试保存具有背景的图像.解决这个问题的建议是保存你所拥有的透明图像
<StackPanel x:Name="AreaWhichWillBeSavedToImage" Background=*Some Color*>
  <Image x:Name="theAlphaimage">
</StackPanel>

现在,如果您不希望图像在GUI上显示,请将其设置为隐藏.

然后,您可以使用您选择的颜色背景保存文件.

var bitmap = await SavetoFileAsync(AreaWhichWillBeSavedToImage,await StorageFile.GetFileFromPathAsync(Windows.ApplicationModel.Package.Current.InstalledLocation.Path + @"someimage.jpg"));

  async Task<rendertargetBitmap> SavetoFileAsync(FrameworkElement uielement,StorageFile file)
    {
        if (file != null)
        {
            CachedFileManager.DeferUpdates(file);

            Guid encoderId = GetBitmapEncoder(file.FileType);

            try
            {
                using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    return await CapturetoStreamAsync(uielement,stream,encoderId);
                }
            }
            catch (Exception ex)
            {
                //displayMessage(ex.Message);
            }

            var status = await CachedFileManager.CompleteUpdatesAsync(file);
        }

        return null;
    }

    async Task<rendertargetBitmap> CapturetoStreamAsync(FrameworkElement uielement,IRandomAccessstream stream,Guid encoderId)
    {
        try
        {
            var rendertargetBitmap = new rendertargetBitmap();
            await rendertargetBitmap.RenderAsync(uielement);

            var pixels = await rendertargetBitmap.GetPixelsAsync();

            var logicalDpi = displayinformation.GetForCurrentView().LogicalDpi;
            var encoder = await BitmapEncoder.CreateAsync(encoderId,stream);
            encoder.SetPixelData(
                BitmapPixelFormat.Bgra8,BitmapAlphaMode.Ignore,(uint)rendertargetBitmap.PixelWidth,(uint)rendertargetBitmap.PixelHeight,logicalDpi,pixels.ToArray());

            await encoder.FlushAsync();

            return rendertargetBitmap;
        }
        catch (Exception ex)
        {
            //displayMessage(ex.Message);
        }

        return null;
    }

    Guid GetBitmapEncoder(string fileType)
    {
        Guid encoderId = BitmapEncoder.JpegEncoderId;
        switch (fileType)
        {
            case ".bmp":
                encoderId = BitmapEncoder.BmpEncoderId;
                break;
            case ".gif":
                encoderId = BitmapEncoder.GifEncoderId;
                break;
            case ".png":
                encoderId = BitmapEncoder.PngEncoderId;
                break;
            case ".tif":
                encoderId = BitmapEncoder.TiffEncoderId;
                break;
        }

        return encoderId;
    }

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...