在 Png 中渲染 Canvas 控件时,我丢失了背景图像

While Rendering Canvas control in Png I lost the background image

我的应用程序是一个 windows 8 商店应用程序。它用相机拍照,然后我在图像上绘图,我想同时保存图像和绘图。我得到的结果只是图纸。我丢失了背景图像。 下面是我的实现:

XAML代码: (代替为拍摄的照片使用图像控件和为绘图使用 canvas,我将照片 = CurrentPicture 绑定为 canvas 的背景)

 <Canvas Grid.Row="1"
                    Grid.Column="0"
                    x:Name="InkCanvas"
                    Background="{Binding CurrentPicture, Converter={StaticResource WPhotoToCanvasBackgroundConverter}}"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Left"
                    Margin="0"
                    Width="1024"
                    Height="768" />

C# :

        private async Task<IPhoto> RenderCanvasToPNG()
    {
        MemoryStream stream = await WriteableBitmapRenderExtensions.RenderToPngStream(InkCanvas);
        var bitmap = new BitmapImage();
        await bitmap.SetSourceAsync(System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream(stream));
        byte[] byteme = stream.ToArray();
        var photo = new WPhotos(null, byteme, bitmap.PixelWidth, bitmap.PixelHeight, bitmap);
        return photo;
    }

非常感谢您的宝贵时间:)

没有直接的方法从 BitmapImage 或 ImageBrush 中提取像素。我相信 WriteableBitmapEx 通过查找图像的源 URI 并查找它来伪造它,但只有当图像是从 URI 加载时此方法才有效。如果它被流式传输到图像中,则无法提取它。

相反,您可以使用 RenderTargetBitmap 将 UIElement 渲染为位图。由于它使用 Xaml 渲染引擎,它可以访问用于 Canvas' 背景的 ImageBrush 并且应该完全渲染 Canvas 及其内容(除非不可渲染的内容,例如 MediaElement或 SwapChainPanel)。