65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (6投票s)

2014年4月22日

Ms-PL

2分钟阅读

viewsIcon

41381

通过这段代码,你可以快速高效地打印图像,并使用 A4 页面中最大的区域来显示你的图像。

引言

这个技巧展示了一种快速打印图像的技术,当打印图像时,它会利用 A4 页面中最大的可用区域。这段代码支持几乎所有图像,甚至包括全景图等特殊情况。

工作原理

代码执行的操作如下

  1. 获取原始图像的宽高比(宽度/高度)。
  2. 如果图像宽度大于图像高度,应用程序会将其旋转。
  3. 将原始图像转换为针对 A4 纸张尺寸优化的图像。它不会拉伸图像,并保持原始宽高比,通过将图像宽度更改为 A4 纸张宽度并根据宽高比计算高度。
  4. 如果编辑后的图像高度大于 A4 高度,则再次调整图像大小。
  5. 再次执行操作 4。
  6. 将调整大小后的图像绘制到位图,并通过 `printdocument` 组件进行打印。

打印组件的工作原理

  1. 我们有一张图像。尺寸:2816 x 2112 像素。
  2. 由于图像宽度大于图像高度,因此图像已被旋转。
  3. A4 高度:1100 像素。
  4. 图像宽高比(宽度/高度):0.75
  5. 新图像宽度:0.75 * 1050 = 825 像素。
  6. 带有新宽度和高度的新图像正在被绘制并发送到打印机。
  7. 结果(预览为 xps 文件)

代码如下

首先,我们需要声明我们的组件。这个例子需要的组件是两个 `PictureBoxes` (Picturebox1Picturebox2) 和一个 `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 的一部分。

© . All rights reserved.