0
其实我要从Viewport3D
打印视图,显然我用的是RenderTargetBitmap
。问题是如果渲染图像的分辨率变高,我的场景的一些三角形不会出现在我的最终图像上。在WPF中RenderToBitmap的麻烦
例如,我viewport
可以1024 * 768,我和我的RenderTargetBitmap
使用的分辨率将是3倍viewport
的分辨率。
我已经解决了这个问题以某种方式......其实,当我使用一个大规模的三角形不会出现。如果我减小我的RenderTargetBitmap
的大小,它将包含一切。
其实我差不多有1024 * 768在96dpi。如果我想留下深刻的印象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