2015-11-23 28 views
10

に背景色を追加します。私は複数のPNG画像を1つのビデオに結合することに成功しました。ただし、作成されたファイルには黒い背景があります。最初に私は、ファイルがファイルをPNG形式いたので、これはあるかもしれないと思ったが、同じbevaviourはJPGのみのために発生します。画像を保存する方法は次のとおりです。は私がMediaCompositionを作成しようとしているMediaComposition

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ライブラリを使用して問題を解決しthis答えを見つけ

。それは私の実際の問題に対処していませんが、私はそれを回避することができます。うまくいけば、そこにはもっと良い解決策があります。このことについて、私は理解して

+0

あなたがやろうとしているかは明らかではありません。アルファ背景なしで画像を保存するだけですか? –

+0

画像を背景で保存するか、またはビデオファイルの作成時に背景を重ねる(現在はMediaCompositionを使用) –

答えて

5

唯一のことは、あなたが背景に画像を保存しようとしているです。これを解決するための私の提案は、あなたがイメージがちょうど隠しに設定して、あなたのGUIに表示したくない場合は今すぐ

<StackPanel x:Name="AreaWhichWillBeSavedToImage" Background=*Some Color*> 
    <Image x:Name="theAlphaImage"> 
</StackPanel> 

のようなものにあなたが持っている透明画像を保存することです。

次に、あなたの好みの色の背景を持つファイルを保存することができます。

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, 
       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; 
    } 
+0

これはInkCanvasでは機能しないと思われる –

+0

InkCanvas ImageをAlphaImageのImageSourceとして保存してから、 –

+0

これは次のような意味です:それでも動作しないようです。 –

関連する問題