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

前端之家收集整理的这篇文章主要介绍了c# – 将背景颜色添加到MediaComposition前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个MediaComposition.我已经成功地将多个图像组合成一个视频;但是,创建的文件具有黑色背景.起初我以为这可能是因为这些文件是png文件,但是对于jpg来说,这个文件是相同的.以下是我如何保存图像:
  1. public async Task<bool> Save(InkCanvas canvas,StorageFile file)
  2. {
  3.  
  4. if (canvas != null && canvas.InkPresenter.StrokeContainer.GetStrokes().Count > 0)
  5. {
  6. if (file != null)
  7. {
  8. using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
  9. {
  10. await canvas.InkPresenter.StrokeContainer.SaveAsync(stream);
  11. }
  12. }
  13. Clear(canvas);
  14. return true;
  15. }
  16. return false;
  17. }

它保存图像很好,但背景是alpha.这意味着当我尝试将它们链接在一起成为媒体作品时,没有背景,它呈现为黑色.在创建MediaComposition以更正此问题时,我已尝试使用叠加层:

  1. MediaClip overlayVideoClip = MediaClip.CreateFromColor(Colors.White,new TimeSpan(0,1,0));
  2. MediaOverlay mo = new MediaOverlay(overlayVideoClip);
  3. MediaOverlayLayer mol = new MediaOverlayLayer();
  4. mol.Overlays.Add(mo);
  5.  
  6. composition.OverlayLayers.Add(mol);

但无济于事我的怀疑是,在这种情况下,我误会了术语叠加的含义.所以,我的问题是:是否可以在构图时覆盖视频,如果是,怎么办?或者,如果这需要在图像本身完成,我如何保存图像与背景?

编辑:

我已经取得进展(?)以下编译和运行,但创建一个坚实的黑色图像:

  1. public async Task TestSave(InkCanvas canvas,StorageFile file)
  2. {
  3. RenderTargetBitmap rtb =
  4. new RenderTargetBitmap();
  5. PixelFormats.Pbgra32);
  6. await rtb.RenderAsync(canvas);
  7. var pixelBuffer = await rtb.GetPixelsAsync();
  8.  
  9. using (IRandomAccessStream stream =
  10. await file.OpenAsync(FileAccessMode.ReadWrite))
  11. {
  12. BitmapEncoder encoder =
  13. await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId,stream);
  14.  
  15. encoder.SetPixelData(BitmapPixelFormat.Bgra8,BitmapAlphaMode.Straight,(uint)rtb.PixelWidth,(uint)rtb.PixelHeight,96d,pixelBuffer.ToArray());
  16.  
  17. await encoder.FlushAsync();
  18. }
  19. }

编辑:

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

解决方法

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

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

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

  1. var bitmap = await SaveToFileAsync(AreaWhichWillBeSavedToImage,await StorageFile.GetFileFromPathAsync(Windows.ApplicationModel.Package.Current.InstalledLocation.Path + @"someimage.jpg"));
  2.  
  3. async Task<RenderTargetBitmap> SaveToFileAsync(FrameworkElement uielement,StorageFile file)
  4. {
  5. if (file != null)
  6. {
  7. CachedFileManager.DeferUpdates(file);
  8.  
  9. Guid encoderId = GetBitmapEncoder(file.FileType);
  10.  
  11. try
  12. {
  13. using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
  14. {
  15. return await CaptureToStreamAsync(uielement,stream,encoderId);
  16. }
  17. }
  18. catch (Exception ex)
  19. {
  20. //DisplayMessage(ex.Message);
  21. }
  22.  
  23. var status = await CachedFileManager.CompleteUpdatesAsync(file);
  24. }
  25.  
  26. return null;
  27. }
  28.  
  29. async Task<RenderTargetBitmap> CaptureToStreamAsync(FrameworkElement uielement,IRandomAccessStream stream,Guid encoderId)
  30. {
  31. try
  32. {
  33. var renderTargetBitmap = new RenderTargetBitmap();
  34. await renderTargetBitmap.RenderAsync(uielement);
  35.  
  36. var pixels = await renderTargetBitmap.GetPixelsAsync();
  37.  
  38. var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
  39. var encoder = await BitmapEncoder.CreateAsync(encoderId,stream);
  40. encoder.SetPixelData(
  41. BitmapPixelFormat.Bgra8,BitmapAlphaMode.Ignore,(uint)renderTargetBitmap.PixelWidth,(uint)renderTargetBitmap.PixelHeight,logicalDpi,pixels.ToArray());
  42.  
  43. await encoder.FlushAsync();
  44.  
  45. return renderTargetBitmap;
  46. }
  47. catch (Exception ex)
  48. {
  49. //DisplayMessage(ex.Message);
  50. }
  51.  
  52. return null;
  53. }
  54.  
  55. Guid GetBitmapEncoder(string fileType)
  56. {
  57. Guid encoderId = BitmapEncoder.JpegEncoderId;
  58. switch (fileType)
  59. {
  60. case ".bmp":
  61. encoderId = BitmapEncoder.BmpEncoderId;
  62. break;
  63. case ".gif":
  64. encoderId = BitmapEncoder.GifEncoderId;
  65. break;
  66. case ".png":
  67. encoderId = BitmapEncoder.PngEncoderId;
  68. break;
  69. case ".tif":
  70. encoderId = BitmapEncoder.TiffEncoderId;
  71. break;
  72. }
  73.  
  74. return encoderId;
  75. }

猜你在找的C#相关文章