2012-03-14 113 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的容器保存到位圖中,它將拾取所有的孩子。