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.
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? –
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) –