在silverlight/wpf中将多个画布控件保存为图像

在silverlight/wpf中将多个画布控件保存为图像,wpf,silverlight,image,Wpf,Silverlight,Image,我有一个场景,我有一个带有图像的画布,我在上面放置了多个画布控件,每个画布上可能有多个控件(椭圆、线条等)。将所有这些画布控件保存到一个图像的最佳/最有效的方法是什么?我假设是WritableBitmap,但如何处理多个画布控件?其中一个假设是,每个画布的大小都相同 编辑: 这就是我试过的。我还尝试了原始图像的dpi,这给了我微小的结果 BitmapSource bms = (BitmapSource)this.ctlImage.Source; Matrix m = PresentationS

我有一个场景,我有一个带有图像的画布,我在上面放置了多个画布控件,每个画布上可能有多个控件(椭圆、线条等)。将所有这些画布控件保存到一个图像的最佳/最有效的方法是什么?我假设是WritableBitmap,但如何处理多个画布控件?其中一个假设是,每个画布的大小都相同

编辑:

这就是我试过的。我还尝试了原始图像的dpi,这给了我微小的结果

BitmapSource bms = (BitmapSource)this.ctlImage.Source;

Matrix m = PresentationSource.FromVisual(this.ctlImgCanvas).CompositionTarget.TransformToDevice; 

RenderTargetBitmap rtb = new RenderTargetBitmap(bms.PixelWidth, bms.PixelHeight, m.M11 * 96.0, m.M22 * 96.0, PixelFormats.Pbgra32);

rtb.Render(this.ctlImgCanvas);

PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
            encoder.Save(memStream);

将画布的容器保存到位图,它将拾取所有子对象。

这将处理包括画布子对象在内的所有内容。你不需要事先知道画布的大小

Matrix m =
PresentationSource.FromVisual(canvas).CompositionTarget.TransformToDevice;

BitmapSource panelBitmap = new RenderTargetBitmap(
                (int)Math.Floor(canvas.ActualWidth),
                (int)Math.Floor(canvas.ActualHeight),
                m.M11 * 96.0, // For DPI. This hardcoded value is correct. Check WPF DPI
                m.M22 * 96.0, 
                PixelFormats.Default);

panelBitmap.Render(canvas);

using (FileStream fs = File.Open([filename], FileModel.Create, FileAccess.Write))
{
    BitmapEncoder encoder = GetBitmapEncoderForFileExtension([filename]); // See documentation for which encoder to use when.
    encoder.Frames.Add(BitmapFrame.Create(panelBitmap ));
    encoder.Save(fs);
}

这适用于WPF。我最终使用了用于silverlight的ImageTools.RenderTargetBitmap将仅使用PixelFormats.Pbgra32构建,并且我的图像最终的高度和宽度都是正确的,但实际图像在图像的左上角向下收缩。知道为什么吗?什么是图像?它与画布有什么关系?什么是源属性?怎么算的?啊,对不起。仓促的剪切和粘贴。ctlImageCanvas是我要导出的画布。ctlImage是一个图像,是ctlImageCanvas的子级。Source是指向服务器上jpeg的Uri。您到底想做什么?您询问了如何将画布及其所有子元素捕捉到位图。在代码中,您使用图像的大小来计算渲染位图的大小。然后使用图像的大小将画布复制到位图。你到底想要什么?没有任何意义。RenderTargetBitmap的大小应与要拍摄图像的画布的大小相同。CTL图像应该不在图片中的任何位置。为什么你认为bms.PixelWidth/bms.PixelWidth应该给出画布的大小?