2013-05-02 82 views
0

其实我要从Viewport3D打印视图,显然我用的是RenderTargetBitmap。问题是如果渲染图像的分辨率变高,我的场景的一些三角形不会出现在我的最终图像上。在WPF中RenderToBitmap的麻烦

例如,我viewport可以1024 * 768,我和我的RenderTargetBitmap使用的分辨率将是3倍viewport的分辨率。

http://imgur.com/PS2F9D9

我已经解决了这个问题以某种方式......其实,当我使用一个大规模的三角形不会出现。如果我减小我的RenderTargetBitmap的大小,它将包含一切。

其实我差不多有1024 * 76896dpi。如果我想留下深刻的印象300dpi,我需要获得一个巨大的图像,所以我想避免这最后的解决方案。

一些代码:

public static RenderTargetBitmap CaptureEcran(Viewport3D p_viewPort, int p_scale) 
    { 
     RenderTargetBitmap l_bmp; 
     p_scale = p_scale > 5 ? 5 : p_scale; 
     l_bmp = new RenderTargetBitmap(p_scale * Convert.ToInt32(p_viewPort.ActualWidth), p_scale * Convert.ToInt32(p_viewPort.ActualHeight), p_scale * 96.0, p_scale * 96.0, PixelFormats.Pbgra32); 

     DrawingVisual vis = new DrawingVisual(); 
     DrawingContext dc = vis.RenderOpen(); 
     dc.DrawRectangle(System.Windows.Media.Brushes.White, null, new Rect(0, 0, p_scale * p_viewPort.ActualWidth, p_scale * p_viewPort.ActualHeight)); 
     dc.Close(); 

     l_bmp.Render(vis); 
     p_viewPort.UpdateLayout(); 
     l_bmp.Render(p_viewPort); 
     return l_bmp; 
    } 

public static void SaveImage(RenderTargetBitmap renderTargetBitmap, string m_impression) 
    { 
     System.Windows.Forms.FolderBrowserDialog l_fBD = new System.Windows.Forms.FolderBrowserDialog(); 
     l_fBD.ShowDialog(); 
     string l_path = l_fBD.SelectedPath + "\\" + CurrentUser() + "__" + CurrentDate() + "__." + m_impression.ToLower(); 
     FileStream stream = new FileStream(l_path, FileMode.Create); 

     BitmapEncoder l_encoder = null; 
     switch(m_impression){ 
      case "PNG": 
       PngBitmapEncoder l_png = new PngBitmapEncoder(); 
       l_encoder = l_png; 
       break; 
      case "JPEG": 
       JpegBitmapEncoder l_jpeg = new JpegBitmapEncoder(); 
       l_jpeg.QualityLevel = 30; 
       l_encoder = l_jpeg; 
       break; 
     } 
     l_encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); 
     l_encoder.Save(stream); 
     stream.Close(); 
    } 

我的电话是:

SaveImage(CaptureEcran(m_viewPortCourant.ViewPort3D,5), m_impression); 

凡m_impression是png格式或.jpg

回答

0

最后,它的工作原理是使用含有视口和绘制成VisualBrush DrawingContext。

DrawingVisual vis = new DrawingVisual(); 
DrawingContext dc = vis.RenderOpen(); 
VisualBrush sourceBrush = new VisualBrush(p_viewPort); 

dc.DrawRectangle(System.Windows.Media.Brushes.White, null, new Rect(0, 0, p_viewPort.ActualWidth * p_scale, p_viewPort.ActualHeight * p_scale)); 
dc.DrawRectangle(sourceBrush, null, new Rect(new System.Windows.Point(0, 0), new Vector(p_viewPort.ActualWidth, p_viewPort.ActualHeight))); 
dc.Close();  

l_bmp.Render(vis);