Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将CanvasControl的内容添加到MediaClip_C#_Windows_Uwp_Video Processing_Win2d - Fatal编程技术网

C# 如何将CanvasControl的内容添加到MediaClip

C# 如何将CanvasControl的内容添加到MediaClip,c#,windows,uwp,video-processing,win2d,C#,Windows,Uwp,Video Processing,Win2d,我正在创建一个uwp应用程序,其中用户键入的文本将转换为视频覆盖。用户加载视频,输入他们的文本,获得带有文本的视频预览,然后他们可以使用覆盖保存他们的视频。 现在,它可以使用图像覆盖,但不能使用文本。我正在尝试使用win2d格式化文本。但是,我不知道如何将win2d画布控件放入windows.media.editing媒体剪辑中 我想我可以去画布控制>某种位图>图像>媒体剪辑,但媒体剪辑只能通过存储文件或直接3d表面创建。一切都会有帮助的!这是我第一次尝试在游戏引擎之外写东西 当前将画布控件转换

我正在创建一个uwp应用程序,其中用户键入的文本将转换为视频覆盖。用户加载视频,输入他们的文本,获得带有文本的视频预览,然后他们可以使用覆盖保存他们的视频。 现在,它可以使用图像覆盖,但不能使用文本。我正在尝试使用win2d格式化文本。但是,我不知道如何将win2d画布控件放入windows.media.editing媒体剪辑中

我想我可以去画布控制>某种位图>图像>媒体剪辑,但媒体剪辑只能通过存储文件或直接3d表面创建。一切都会有帮助的!这是我第一次尝试在游戏引擎之外写东西

当前将画布控件转换为位图的部分:

private async void btnAddOverlay_Click(object sender, RoutedEventArgs e)
        {

            var bitmap = new RenderTargetBitmap();
            await bitmap.RenderAsync(canvasControl);
            IBuffer pixelBuffer = await bitmap.GetPixelsAsync();
            byte[] pixels = pixelBuffer.ToArray();
            SoftwareBitmap outputBitmap = SoftwareBitmap.CreateCopyFromBuffer
            (
                pixelBuffer,
                BitmapPixelFormat.Bgra8,
                bitmap.PixelWidth,
                bitmap.PixelHeight
            );
        }
将图像覆盖添加到视频的旧部分。(overlayImageFile是存储文件。我只是不知道如何将outputBitmap转换为存储文件来制作媒体剪辑。)

Windows MediaClip类:

我只是不知道如何将outputBitmap转换成一个存储文件来制作媒体剪辑

private async void CreateOverlays()
        {
            // Create a clip from video and add it to the composition
            var baseVideoClip = await MediaClip.CreateFromFileAsync(pickedFile);
            composition = new MediaComposition();
            composition.Clips.Add(baseVideoClip);

            // Create a clip from image
            var overlayImageClip = await MediaClip.CreateFromImageFileAsync(overlayImageFile,timeSpan);

            // Put image in upper left corner, retain its native aspect ratio
            Rect imageOverlayPosition;
            imageOverlayPosition.Height = mediaElement.ActualHeight / 3;
            imageOverlayPosition.Width = (double)imageBitmap.PixelWidth / (double)imageBitmap.PixelHeight * imageOverlayPosition.Height;
            imageOverlayPosition.X = 0;
            imageOverlayPosition.Y = 0;

            // Make the clip from the image an overlay
            var imageOverlay = new MediaOverlay(overlayImageClip);
            imageOverlay.Position = imageOverlayPosition;
            imageOverlay.Opacity = 0.8;

            // Make a new overlay layer and add the overlay to it
            var overlayLayer = new MediaOverlayLayer();
            overlayLayer.Overlays.Add(imageOverlay);
            composition.OverlayLayers.Add(overlayLayer);

            //Render to MediaElement
            mediaElement.Position = TimeSpan.Zero;
            mediaStreamSource = composition.GeneratePreviewMediaStreamSource((int)mediaElement.ActualWidth, (int)mediaElement.ActualHeight);
            mediaElement.SetMediaStreamSource(mediaStreamSource);
            txbNotification.Text = "Overlay creaeted";
        }
获取
渲染目标位图
后,无需转换为
软件位图
。您可以通过
BitmapEncoder
以指定格式将像素数据存储为文件。方法如下:

private async void btnAddOverlay\u单击(对象发送方,路由目标)
{
RenderTargetBitmap RenderTargetBitmap=新建RenderTargetBitmap();
等待renderTargetBitmap.RenderAsync(canvasControl);
var pixelBuffer=await renderTargetBitmap.GetPixelsAsync();
var pixels=pixelBuffer.ToArray();
var displayInformation=displayInformation.GetForCurrentView();
//在本地文件夹中创建文件
var file=await ApplicationData.Current.LocalFolder.CreateFileAsync(“TempCanvas.png”,CreationCollisionOption.ReplaceExisting);
//写入数据
使用(var stream=await file.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder=await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId,stream);
编码器.SetPixelData(BitmapPixelFormat.Bgra8,BitmapAlphaMode.Premultiplied,(uint)renderTargetBitmap.PixelWidth,(uint)renderTargetBitmap.PixelHeight,displayInformation.RawDpiX,displayInformation.RawDpiY,pixels);
等待编码器。FlushAsync();
}
}
需要时,您可以使用以下代码获取保存的图片:

var file=wait ApplicationData.Current.LocalFolder.GetFileAsync(“tempcanavas.png”);

这只是另一种可能的方式

如果您使用的是win2d,则无法使用

MediaClip.CreateFromSurface(IDirect3DSurface,TimeSpan)函数和

可以将画布渲染目标直接传递给此方法

这样您就不必将位图保存到文件中

因此,您必须创建一个脱机画布设备 然后是画布渲染目标 然后在上面画上文字 然后将该渲染目标传递给函数
它将为overlay生成媒体剪辑

你到底在问什么?到底是什么不起作用?“旧零件”是什么意思?我想这里面有个好问题,但不清楚。重新工作,重新措辞,让它更清楚。谢谢!我不知道如何保存一个临时文件而不提示用户之前选择它。这太完美了!