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

如何使用GDI+在打印时将图像绘制到整个页面

WinAPI+GDI+打印图片铺满页面的调整方案

问题根因

你当前的代码是按照图片自身DPI换算原物理尺寸打印,没有适配打印页面的实际可用尺寸,因此无法铺满页面。

调整步骤

  • 第一步:获取打印页面可用尺寸
    打印机存在硬件无法打印的边距,需先通过打印DC获取可打印区域的尺寸,换算为与绘图单位一致的英寸单位。
  • 第二步:计算图片缩放比例
    可根据需求选择对应逻辑:
    1. 等比适配页面、图片完整显示:取宽、高缩放比的较小值,剩余区域留白
    2. 铺满整个页面不留白:取宽、高缩放比的较大值,超出页面的图片部分会被裁切
  • 第三步:可选调整,计算居中偏移量,避免图片贴左上角显示

修改后完整代码示例

for ( UINT i = 0; i < frameCount; i++ )
{
  StartPage(hDC);
  image.SelectActiveFrame(&pageGuid, i);
  graphics.SetPageUnit(UnitInch);

  // 1. 获取打印机可打印区域的英寸尺寸
  FLOAT printWidth = (FLOAT)GetDeviceCaps(hDC, HORZRES) / GetDeviceCaps(hDC, LOGPIXELSX);
  FLOAT printHeight = (FLOAT)GetDeviceCaps(hDC, VERTRES) / GetDeviceCaps(hDC, LOGPIXELSY);

  // 2. 计算图片原物理英寸尺寸
  FLOAT imgWidth = image.GetWidth() / image.GetHorizontalResolution();
  FLOAT imgHeight = image.GetHeight() / image.GetVerticalResolution();

  // 3. 计算缩放比例,铺满页面不留白用max,完整显示图片用min
  FLOAT scaleX = printWidth / imgWidth;
  FLOAT scaleY = printHeight / imgHeight;
  FLOAT finalScale = max(scaleX, scaleY);

  // 4. 计算最终绘制尺寸
  FLOAT drawWidth = imgWidth * finalScale;
  FLOAT drawHeight = imgHeight * finalScale;

  // 5. 可选:计算居中偏移,让图片在页面居中显示
  FLOAT offsetX = (printWidth - drawWidth) / 2;
  FLOAT offsetY = (printHeight - drawHeight) / 2;

  // 绘制图片
  graphics.DrawImage(&image, offsetX, offsetY, drawWidth, drawHeight);

  EndPage(hDC);
}

注意事项

  • 如果你需要完全铺满整张纸(忽略打印机硬边距),可将printWidth、printHeight替换为纸张物理尺寸:通过GetDeviceCaps(hDC, PHYSICALWIDTH)和GetDeviceCaps(hDC, PHYSICALHEIGHT)换算英寸即可,仅支持无边距打印的打印机会生效,否则边缘内容会被裁切。
  • 不需要保留图片比例的话,可直接将drawWidth、drawHeight设置为printWidth、printHeight,直接拉伸铺满。

内容的提问来源于stack exchange,提问作者duri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:27:05