如何使用GDI+在打印时将图像绘制到整个页面
WinAPI+GDI+打印图片铺满页面的调整方案
问题根因
你当前的代码是按照图片自身DPI换算原物理尺寸打印,没有适配打印页面的实际可用尺寸,因此无法铺满页面。
调整步骤
- 第一步:获取打印页面可用尺寸
打印机存在硬件无法打印的边距,需先通过打印DC获取可打印区域的尺寸,换算为与绘图单位一致的英寸单位。 - 第二步:计算图片缩放比例
可根据需求选择对应逻辑:- 等比适配页面、图片完整显示:取宽、高缩放比的较小值,剩余区域留白
- 铺满整个页面不留白:取宽、高缩放比的较大值,超出页面的图片部分会被裁切
- 第三步:可选调整,计算居中偏移量,避免图片贴左上角显示
修改后完整代码示例
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
相关产品推荐
相关产品推荐

