You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:49:56