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

VB2022实现位图无拉伸缩放至A4尺寸打印的代码咨询

VB2022 实现位图等比例适配A4打印(不变形)

问题说明

现有代码能将Panel中的内容生成为位图并打印到A4纸,但位图会被强制拉伸填充A4区域,导致原有形状变形。需要修改代码,实现位图等比例放大/缩小,完整适配A4纸且保持长宽比。

原始代码

Public Class Form1

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim margX As Single = e.PageSettings.HardMarginX
        Dim margY As Single = e.PageSettings.HardMarginY
        Dim adjustToA4 As New Rectangle(e.PageBounds.Left - margX, e.PageBounds.Top - margY, e.PageBounds.Width, e.PageBounds.Height)


        Dim dm As New Bitmap(Panel2.Width, Panel2.Height)
        Panel2.DrawToBitmap(dm, New Rectangle(0, 0, Panel2.Width, Panel2.Height))

        e.Graphics.DrawImage(dm, adjustToA4)

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        PrintPreviewDialog1.Document = PrintDocument1
        PrintPreviewDialog1.ShowDialog()

    End Sub

End Class

修改后的代码(等比例适配)

Public Class Form1

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        ' 获取打印区域(去除硬边距)
        Dim margX As Single = e.PageSettings.HardMarginX
        Dim margY As Single = e.PageSettings.HardMarginY
        Dim printArea As New RectangleF(e.PageBounds.Left - margX, e.PageBounds.Top - margY, e.PageBounds.Width, e.PageBounds.Height)

        ' 将Panel内容转换为位图
        Dim panelBitmap As New Bitmap(Panel2.Width, Panel2.Height)
        Panel2.DrawToBitmap(panelBitmap, New Rectangle(0, 0, Panel2.Width, Panel2.Height))

        ' 计算等比例缩放比例
        Dim scaleWidth As Single = printArea.Width / panelBitmap.Width
        Dim scaleHeight As Single = printArea.Height / panelBitmap.Height
        Dim scaleFactor As Single = Math.Min(scaleWidth, scaleHeight) ' 取较小比例,保证完整显示

        ' 计算缩放后的位图尺寸
        Dim newWidth As Single = panelBitmap.Width * scaleFactor
        Dim newHeight As Single = panelBitmap.Height * scaleFactor

        ' 计算居中位置(让位图在A4纸中间显示)
        Dim posX As Single = printArea.Left + (printArea.Width - newWidth) / 2
        Dim posY As Single = printArea.Top + (printArea.Height - newHeight) / 2

        ' 绘制等比例缩放后的位图
        e.Graphics.DrawImage(panelBitmap, posX, posY, newWidth, newHeight)

        ' 释放位图资源
        panelBitmap.Dispose()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        PrintPreviewDialog1.Document = PrintDocument1
        PrintPreviewDialog1.ShowDialog()
    End Sub

End Class

关键说明

  • 比例计算:分别计算位图宽高与打印区域宽高的比例,取较小值作为缩放因子,保证位图完整放入A4区域,不会超出边界
  • 居中处理:通过计算打印区域与缩放后位图的尺寸差,让位图在A4纸上居中显示,视觉效果更合理
  • 资源释放:手动调用Dispose()释放位图资源,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:01:17