如何在WPF/C#中实现高分辨率位图打印?
实现WPF/C#中自定义DPI(200dpi)的位图打印
要解决默认96dpi打印导致画质丢失的问题,核心是强制设置打印分辨率,并基于目标DPI计算正确的绘制尺寸,具体实现如下:
1. 为打印文档设置自定义分辨率
初始化PrintDocument时,指定打印分辨率为200dpi,让打印机识别我们需要的输出精度:
var document = new PrintDocument { PrintSettings = _settings, PageCount = 1 }; // 设置打印分辨率为200dpi document.DefaultPageSettings.PrintResolution = new PrintResolution(PrintResolutionKind.Custom, 200, 200);
2. 在PrintPage事件中基于目标DPI计算尺寸并绘制
默认的e.PageSize是基于96dpi的,我们需要根据A4纸的物理尺寸和目标200dpi,手动计算实际像素尺寸,再调整绘图参数:
document.PrintPage += (sender, e) => { int targetDpi = 200; // A4纸物理尺寸转英寸:1英寸=25.4mm float a4WidthInch = 210 / 25.4f; float a4HeightInch = 297 / 25.4f; // 计算200dpi对应的像素尺寸 int targetWidth = (int)(a4WidthInch * targetDpi); int targetHeight = (int)(a4HeightInch * targetDpi); // 调整绘图上下文的DPI匹配目标值 e.Graphics.DpiX = targetDpi; e.Graphics.DpiY = targetDpi; // 按目标尺寸绘制图像 var rect1 = new Rectangle(0, 0, targetWidth, targetHeight); e.Graphics.DrawImage(image1, rect1); Debug.WriteLine($"目标DPI: {targetDpi}, 绘制尺寸: {targetWidth}x{targetHeight}"); }; document.Print();
额外注意事项
- 确保待打印的
image1本身分辨率不低于200dpi,否则打印时无法通过设置DPI提升画质。 - 若打印机不支持自定义分辨率,可替换为
PrintResolutionKind.High使用打印机预设的高分辨率选项。 - 如果使用WPF原生打印API(如
PrintDialog),可通过RenderTargetBitmap按目标DPI渲染视觉元素后再提交打印,逻辑与上述一致。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

