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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)