快速高效地将图像打印到 A4 页面 [VB.NET]






4.47/5 (6投票s)
通过这段代码,你可以快速高效地打印图像,并使用 A4 页面中最大的区域来显示你的图像。
引言
这个技巧展示了一种快速打印图像的技术,当打印图像时,它会利用 A4 页面中最大的可用区域。这段代码支持几乎所有图像,甚至包括全景图等特殊情况。
工作原理
代码执行的操作如下
- 获取原始图像的宽高比(宽度/高度)。
- 如果图像宽度大于图像高度,应用程序会将其旋转。
- 将原始图像转换为针对 A4 纸张尺寸优化的图像。它不会拉伸图像,并保持原始宽高比,通过将图像宽度更改为 A4 纸张宽度并根据宽高比计算高度。
- 如果编辑后的图像高度大于 A4 高度,则再次调整图像大小。
- 再次执行操作 4。
- 将调整大小后的图像绘制到位图,并通过 `printdocument` 组件进行打印。
打印组件的工作原理
- 我们有一张图像。尺寸:2816 x 2112 像素。
- 由于图像宽度大于图像高度,因此图像已被旋转。
- A4 高度:1100 像素。
- 图像宽高比(宽度/高度):0.75
- 新图像宽度:0.75 * 1050 = 825 像素。
- 带有新宽度和高度的新图像正在被绘制并发送到打印机。
- 结果(预览为 xps 文件)
代码如下
首先,我们需要声明我们的组件。这个例子需要的组件是两个 `PictureBoxes` (Picturebox1
和 Picturebox2
) 和一个 `PrintDocument` 项目 (prntdoc
)。
Picturebox1
- 将包含原始图像Picturebox2
- 将用于将图像调整到 A4 大小。它的参数 `visible` 应该设置为 `false`(因为它仅在“后台”使用)。
准备工作
Try
PictureBox2.image = PictureBox1.image
首先,我们将检查图像宽度是否大于其高度。如果是,我们将旋转图像,以便它占据 A4 页面的最大可用区域。
If PictureBox2.Image.Width > PictureBox2.Image.Height Then
PictureBox2.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
End If
然后,我们将文本 "1100
"(A4 高度)放入 `TextBox1`。
TextBox1.text = "1100"
现在,我们将声明 `height` 和 `width` 变量。
Dim Height As Double = Convert.ToDouble(TextBox1.Text)
Dim width As Double
Dim aspectRatio As Double
现在,我们获取图像的宽高比,并将其乘以 1100(A4 高度)。
aspectRatio = PictureBox2.Image.Width / PictureBox2.Image.Height
width = Convert.ToDouble(TextBox1.Text * aspectRatio)
可能存在图像宽度大于 A4 宽度(891 像素)的情况。然后,我们将图像调整为较小的大小
If width > 891 Then
PictureBox2.Image = PictureBox1.Image
PictureBox1.Visible = False
If PictureBox2.Image.Width > PictureBox2.Image.Height Then
PictureBox2.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
End If
TextBox1.Text = "900"
Height = Convert.ToDouble(TextBox1.Text)
aspectRatio = PictureBox2.Image.Width / PictureBox2.Image.Height
width = Convert.ToDouble(TextBox1.Text * aspectRatio)
If width > 891 Then
PictureBox2.Image = PictureBox1.Image
PictureBox1.Visible = False
If PictureBox2.Image.Width > PictureBox2.Image.Height Then
PictureBox2.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
End If
TextBox1.Text = "700"
Height = Convert.ToDouble(TextBox1.Text)
width = Convert.ToDouble(TextBox1.Text * aspectRatio)
Else
完成所有这些操作后,代码绘制图像并将其发送到打印机。
Dim wi As Integer
wi = Convert.ToInt32(width)
Dim hi As Integer
hi = Convert.ToInt32(Height)
Dim New_Bitmap As New Bitmap(PictureBox2.Image, wi, hi)
PictureBox2.Image = New_Bitmap
End If
Else
Dim wi As Integer
wi = Convert.ToInt32(width)
Dim hi As Integer
hi = Convert.ToInt32(Height)
Dim New_Bitmap As New Bitmap(PictureBox2.Image, wi, hi)
PictureBox2.Image = New_Bitmap
End If
' End If
prntdoc.Print()
Catch ex As Exception
msgbox("bug.")
End Try
最后阶段:当 `PrintDocument` 项目被激活时,它会将最终位图(没有边距,因为我们使用 A4 页面的完整大小)发送到打印机。
Private Sub prntdoc_PrintPage1(sender As Object, e As PrintPageEventArgs) Handles prntdoc.PrintPage
e.PageSettings.Margins = New Margins(0, 0, 0, 0)
e.Graphics.DrawImage(PictureBox2.Image, 0, 0)
End Sub
所有代码组合如下
Try
PictureBox2.image = PictureBox1.image
If PictureBox2.Image.Width > PictureBox2.Image.Height Then
PictureBox2.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
End If
TextBox1.text = "1100"
Dim Height As Double = Convert.ToDouble(TextBox1.Text)
Dim width As Double
Dim aspectRatio As Double
aspectRatio = PictureBox2.Image.Width / PictureBox2.Image.Height
width = Convert.ToDouble(TextBox1.Text * aspectRatio)
If width > 891 Then
PictureBox2.Image = PictureBox1.Image
PictureBox1.Visible = False
If PictureBox2.Image.Width > PictureBox2.Image.Height Then
PictureBox2.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
End If
TextBox1.Text = "900"
Height = Convert.ToDouble(TextBox1.Text)
aspectRatio = PictureBox2.Image.Width / PictureBox2.Image.Height
width = Convert.ToDouble(TextBox1.Text * aspectRatio)
If width > 891 Then
PictureBox2.Image = PictureBox1.Image
PictureBox1.Visible = False
If PictureBox2.Image.Width > PictureBox2.Image.Height Then
PictureBox2.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
End If
TextBox1.Text = "700"
Height = Convert.ToDouble(TextBox1.Text)
width = Convert.ToDouble(TextBox1.Text * aspectRatio)
Else
Dim wi As Integer
wi = Convert.ToInt32(width)
Dim hi As Integer
hi = Convert.ToInt32(Height)
Dim New_Bitmap As New Bitmap(PictureBox2.Image, wi, hi)
PictureBox2.Image = New_Bitmap
End If
Else
Dim wi As Integer
wi = Convert.ToInt32(width)
Dim hi As Integer
hi = Convert.ToInt32(Height)
Dim New_Bitmap As New Bitmap(PictureBox2.Image, wi, hi)
PictureBox2.Image = New_Bitmap
End If
' End If
prntdoc.Print()
Catch ex As Exception
msgbox("bug.")
End Try
关于代码
该代码是 Bell Software 的 Bell Office 的一部分。