WPF Canvas image高分辨率打印

与其将Viewport3DVisual传递给PrintVisual方法, 不如先创建一个300 DPI 的RenderTargetBitmap并调用Render方法以在位图上渲染Viewport3DVisual然后将位图放入Image元素中,通过调用MeasureArrange对其进行布局传递,并将Image元素传递给PrintVisual方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void NormalPrintOnClick(object sender, RoutedEventArgs args)
       {
           PrintDialog dlg = new PrintDialog();
 
           if (dlg.ShowDialog().GetValueOrDefault())
           {
               dlg.PrintVisual(visual3d, "PrintViewport3DVisual: 3D Cube");
           }
       }
 
       void HiResPrintOnClick(object sender, RoutedEventArgs args)
       {
           PrintDialog dlg = new PrintDialog();
 
           if (dlg.ShowDialog().GetValueOrDefault())
           {
               Rect rect = visual3d.Viewport;
 
               // Scale dimensions from 96 dpi to 600 dpi.
               double scale = 600 / 96;
 
               RenderTargetBitmap bitmap = new RenderTargetBitmap((int) (scale * (rect.Width + 1)),
                                                                  (int) (scale * (rect.Height + 1)),
                                                                  scale * 96,
                                                                  scale * 96, PixelFormats.Default);
               bitmap.Render(visual3d);
 
               // Create Image element for hosting bitmap.
               Image img = new Image();
               img.Source = bitmap;
               img.Stretch = Stretch.None;
 
               // Submit Image element to layout pass so it gets finite size.
               img.Measure(new Size(dlg.PrintableAreaWidth,
                                    dlg.PrintableAreaHeight));
               Size sizeImage = img.DesiredSize;
               img.Arrange(new Rect(new Point(0, 0), sizeImage));
 
               // Print the Image element.
               dlg.PrintVisual(img, "PrintViewport3DVisual: 3D Cube");
           }
       }

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void ExportToPng(Uri path, Image surface)
{
if (path == null) return;
 
Transform transform = surface.LayoutTransform;
surface.LayoutTransform = null;
 
System.Windows.Size size = new System.Windows.Size(surface.Width, surface.Height);
surface.Measure(size);
surface.Arrange(new Rect(size));
 
RenderTargetBitmap renderBitmap =
new RenderTargetBitmap(
(int)size.Width,
(int)size.Height,
96d,
96d,
PixelFormats.Pbgra32);
renderBitmap.Render(surface);
 
using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create))
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
encoder.Save(outStream);
}
surface.LayoutTransform = transform;
}

  

posted @   多见多闻  阅读(317)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示