2015-11-23 33 views
10

Tôi đang cố tạo một MediaComposition. Tôi đã thành công trong việc kết hợp nhiều hình ảnh png vào một video; tuy nhiên, các tệp được tạo có nền đen. Lúc đầu, tôi nghĩ rằng điều này có thể là do các tệp là tệp png, nhưng bevaviour giống nhau xảy ra đối với jpg. Sau đây là cách tôi lưu hình ảnh:Thêm màu nền cho 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; 
} 

Nó giúp lưu hình ảnh tốt, nhưng hậu cảnh là alpha. Điều này có nghĩa là khi tôi thử và kết nối chúng lại với nhau thành một thành phần phương tiện truyền thông, không có nền, và nó ám chỉ như màu đen. Tôi đã thử sử dụng lớp phủ khi tạo MediaComposition để sửa lỗi này:

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); 

Nhưng không có kết quả. Nghi ngờ của tôi là tôi hiểu nhầm ý nghĩa của lớp phủ trong trường hợp này. Vì vậy, câu hỏi của tôi là: có thể phủ lên video tại thời điểm sáng tác không và nếu có thì làm cách nào? Ngoài ra, nếu điều này cần phải được thực hiện trong chính hình ảnh, làm thế nào tôi có thể lưu hình ảnh với nền?

EDIT:

Tôi đã thực hiện (?) Với điều này; các biên dịch sau và chạy, nhưng tạo ra một hình ảnh đen rắn:

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();     
     } 
    } 

EDIT:

Tôi tìm thấy câu trả lời this, trong đó loại giải quyết vấn đề bằng cách sử dụng thư viện Win2D; mặc dù nó không giải quyết vấn đề thực tế của tôi, nó cho phép tôi để xung quanh nó. Hy vọng rằng có một giải pháp tốt hơn trên mạng.

+0

Không rõ bạn đang cố gắng làm gì. Chỉ cần lưu hình ảnh không có nền alpha? –

+0

Hoặc lưu hình ảnh với nền hoặc lớp nền tại thời điểm tạo tệp video (hiện đang sử dụng MediaComposition) –

Trả lời

5

Điều duy nhất tôi hiểu về điều này là bạn đang cố gắng lưu hình ảnh với nền. Đề xuất của tôi để giải quyết vấn đề này là để lưu hình ảnh trong suốt, bạn phải như sau:

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

Bây giờ nếu bạn không muốn hình ảnh hiển thị trên GUI chỉ cần đặt hình ảnh thành Ẩn.

Sau đó, bạn có thể lưu tệp với nền màu bạn chọn.

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

Tôi không nghĩ rằng thao tác này sẽ có hiệu lực cho InkCanvas –

+0

Lưu Hình ảnh InkCanvas làm ImageSource củaAlphaImage, sau đó hoạt động –

+0

Nếu bạn có ý nghĩa như thế này: thì nó dường như không hoạt động –