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

c# – 将背景颜色添加到MediaComposition,第1张

概述我正在尝试创建一个MediaComposition.我已经成功地将多个图像组合成一个视频;但是,创建的文件具有黑色背景.起初我以为这可能是因为这些文件是png文件,但是对于jpg来说,这个文件是相同的.以下是我如何保存图像: public async Task<bool> Save(InkCanvas canvas, StorageFile file){ if (canvas != n 我正在尝试创建一个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;    }
总结

以上是内存溢出为你收集整理的c# – 将背景颜色添加到MediaComposition全部内容,希望文章能够帮你解决c# – 将背景颜色添加到MediaComposition所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存