2012-03-14 72 views
1

我有一种情况,其中有一个图像画布,并在其上放置了多个画布控件,并且每个画布上可能都有多个控件(椭圆,线条等)。什么是将所有这些画布控件保存到一个图像的最好/最有效的方法?我假设WritableBitmap,但这将如何与多个画布控件一起工作?一个给定的是每个画布将是相同的大小。将多个画布控件另存为silverlight/wpf中的图像

编辑:

这是我试过的。我也尝试过使用原始图像的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); 

回答

0

这将照顾一切,包括帆布的儿童。您不需要事先知道画布的大小。

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); 
} 
+0

这适用于WPF。我最终使用ImageTools进行Silverlight。 – PhilBrown 2012-03-15 17:26:59

+0

RenderTargetBitmap只会与PixelFormats.Pbgra32一起构建,而我的图像最终是正确的高度和宽度,但实际图像在图像的左上角收缩。任何想法为什么? – PhilBrown 2012-03-15 18:30:26

+0

显示您的代码。你使用什么编码器? – NVM 2012-03-16 13:14:55

0

将Canvas的容器保存到位图中,它将拾取所有的孩子。