在 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)。
我的应用程序是一个 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)。