b="c"\a.jpg"
Printer.PaintPicture LoadPicture(b), 0, 0
Printer.EndDoca.jpg本身是A4幅面大小的,不知为何打出来的图像很大,每个字都很大,结果出来了好几页,每页上有一部分。
我想问如何把图像打印到A4幅面上,如果它比A4小,就打印成原大小,如果比A4大,就强制缩成A4大小,请大家帮我。
Printer.PaintPicture LoadPicture(b), 0, 0
Printer.EndDoca.jpg本身是A4幅面大小的,不知为何打出来的图像很大,每个字都很大,结果出来了好几页,每页上有一部分。
我想问如何把图像打印到A4幅面上,如果它比A4小,就打印成原大小,如果比A4大,就强制缩成A4大小,请大家帮我。
Printer.PaintPicture 方法
Visual Studio 2008其他版本 Visual Studio 2010
更新:2007 年 11 月在页面上打印图像文件的内容。命名空间: Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6
程序集: Microsoft.VisualBasic.PowerPacks.Vs(在 Microsoft.VisualBasic.PowerPacks.Vs.dll 中)语法
--------------------------------------------------------------------------------VBC#C++F#JScript
复制'声明Public Sub PaintPicture ( _
picture As Image, _
x1 As Single, _
y1 As Single, _
width1 As Single, _
height1 As Single, _
x2 As Single, _
y2 As Single, _
width2 As Single, _
height2 As Single _
)
'用法Dim instance As Printer
Dim picture As Image
Dim x1 As Single
Dim y1 As Single
Dim width1 As Single
Dim height1 As Single
Dim x2 As Single
Dim y2 As Single
Dim width2 As Single
Dim height2 As Singleinstance.PaintPicture(picture, x1, y1, _
width1, height1, x2, y2, width2, height2)
参数
picture
类型:System.Drawing.ImageImage 值,表示要打印的图像。x1
类型:System.SingleSingle 类型的值,指示此图像的打印位置的水平目标坐标。ScaleMode 属性确定所用的度量单位。y1
类型:System.SingleSingle 类型的值,指示此图像的打印位置的垂直目标坐标。ScaleMode 属性确定所用的度量单位。width1
类型:System.Single可选。Single 类型的值,指示图片的目标宽度。对象的 ScaleMode 属性确定所用的度量单位。如果目标宽度大于或小于源宽度,图片将进行拉伸或压缩以适合页面。如果省略此参数,则将使用源宽度。height1
类型:System.Single可选。Single 类型的值,指示图片的目标高度。对象的 ScaleMode 属性确定所用的度量单位。如果目标高度大于或小于源高度,图片将进行拉伸或压缩以适合页面。如果省略此参数,则将使用源高度。x2
类型:System.Single可选。Single 类型的值,指示图片中剪裁区域的坐标(x 轴)。对象的 ScaleMode 属性确定所用的度量单位。如果省略,则假定为 0。y2
类型:System.Single可选。Single 类型的值,指示图片中剪裁区域的坐标(y 轴)。对象的 ScaleMode 属性确定所用的度量单位。如果省略,则假定为 0。width2
类型:System.Single可选。Single 类型的值,指示图片中剪裁区域的源宽度。对象的 ScaleMode 属性确定所用的度量单位。如果省略此参数,则将使用整个源宽度。height2
类型:System.Single可选。Single 类型的值,指示图片中剪裁区域的源高度。对象的 ScaleMode 属性确定所用的度量单位。如果省略此参数,则将使用整个源高度。备注
--------------------------------------------------------------------------------您可以通过对目标高度 (height1) 和/或目标宽度 (width1) 使用负值来水平或垂直翻转图片。可以根据需要省略任意个可选尾部参数。如果省略一个或多个可选尾部参数,请不要在指定的最后一个参数后面使用任何逗号。如果要指定一个可选参数,您必须指定在语法中出现的该参数之前的所有可选参数。说明:
Visual Basic 6.0 版本的 Printer 对象包括附加参数 OpCode,该参数用于对位图图像执行位运算。不再支持此参数。
说明:
Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6 命名空间中的函数和对象是提供给用于将 Visual Basic 6.0 升级到 Visual Basic 2008 的工具使用的。在大多数情况下,这些函数和对象重复 .NET Framework 的其他命名空间中的功能。只有 Visual Basic 6.0 代码模型与 .NET Framework 实现有显著区别时才需要这些函数和对象。
示例
--------------------------------------------------------------------------------下面的示例演示如何在页面上打印图像、将图像拉伸或收缩至指定大小。该示例假设您已向项目添加了一个名为 Image1 的 Image 资源。VBC#C++F#JScript
复制Dim pr As New Printer
pr.PaintPicture(My.Resources.Image1, 500, 500, 1000, 1000)
pr.EndDoc()
权限
--------------------------------------------------------------------------------对直接调用方的完全信任。此成员不能由部分信任的代码使用。有关更多信息,请参见通过部分受信任的代码使用库。
Printer.ScaleWidth=...
Printer.ScaleHeighte=...TwipsPerPixelX、TwipsPerPixelY 属性
返回水平 (TwipsPerPixelX) 或垂直 (TwipsPerPixelY) 度量的对象的每一像素中的缇数。语法object.TwipsPerPixelXobject.TwipsPerPixelYobject 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象。说明Windows API 例程一般需要以像素为度量单位。使用这些属性能够快速转换度量单位而不用改变对象的 ScaleMode 属性设置值。
Printer.ScaleX
Printer.ScaleY
都试试吧。
Printer.ScaleMode = vbTwips 'vbMillimeters
' Printer.Zoom = 50
Printer.PaintPicture LoadPicture("E:\My Documents\My Pictures\2b_01.jpg"), 0, 0, 150, 150 '宽度和高度根据你的需要改
Printer.EndDocEnd Sub
'在模块中写如下代码:
'***************************************************************************************************
Public Type ImageSize
Width As Long
Height As Long
End Type Public Function GetImageSize(sFileName As String) As ImageSize
On Error Resume Next
Dim bTemp(3) As Byte, lPos As Long, lFlen As Long
Open sFileName For Binary As #1
lFlen = LOF(1)
Get #1, 1, bTemp()
If bTemp(0) = &H89 And bTemp(1) = &H50 And bTemp(2) = &H4E And bTemp(3) = &H47 Or bTemp(0) = &H42 And bTemp(1) = &H4D Then
Debug.Print "\PNG OR BMP\ "
Get #1, 19, bTemp
GetImageSize.Width = byte2long(bTemp(0), bTemp(1))
Get #1, 23, bTemp
GetImageSize.Height = byte2long(bTemp(0), bTemp(1))
End If
'JPG
If bTemp(0) = &HFF And bTemp(1) = &HD8 And bTemp(2) = &HFF Then
Debug.Print "\JPEG\ "
lPos = 4
Do
Do
Get #1, lPos, bTemp
lPos = lPos + 1
Loop Until (bTemp(0) = &HFF And bTemp(1) <> &HFF) Or lPos > lFlen
Get #1, lPos, bTemp
If bTemp(0) > = &HC0 And bTemp(0) <= &HC3 Then
Get #1, lPos + 4, bTemp
Exit Do
Else
lPos = lPos + (byte2long(bTemp(2), bTemp(1))) + 1
End If
Loop While lPos < lFlen
GetImageSize.Width = byte2long(bTemp(3), bTemp(2))
GetImageSize.Height = byte2long(bTemp(1), bTemp(0))
End If 'GIF file
If bTemp(0) = &H47 And bTemp(1) = &H49 And bTemp(2) = &H46 And bTemp(3) = &H38 Then
Debug.Print "\GIF\ "
Get #1, 7, bTemp
GetImageSize.Width = byte2long(bTemp(0), bTemp(1))
GetImageSize.Height = byte2long(bTemp(2), bTemp(3))
End If
'PSD
If bTemp(0) = &H38 And bTemp(1) = &H42 And bTemp(2) = &H50 And bTemp(3) = &H53 Then
Debug.Print "\PSD\ "
Get #1, 17, bTemp
GetImageSize.Width = byte2long(bTemp(1), bTemp(0))
Get #1, 21, bTemp
GetImageSize.Height = byte2long(bTemp(1), bTemp(0))
End If
'TIF
If bTemp(0) = &H4D And bTemp(1) = &H4D And bTemp(2) = &H0 And bTemp(3) = &H2A Then
Debug.Print "\TIF1\ "
Get #1, 31, bTemp
GetImageSize.Width = byte2long(bTemp(1), bTemp(0))
Get #1, 43, bTemp
GetImageSize.Height = byte2long(bTemp(1), bTemp(0))
End If
If bTemp(0) = &H49 And bTemp(1) = &H49 And bTemp(2) = &H2A And bTemp(3) = &H0 Then
Get #1, 5, bTemp
If bTemp(0) = &H8 And bTemp(1) = &H0 And bTemp(2) = &H0 And bTemp(3) = &H0 Then
'TIF
Debug.Print "\TIF2-1\ "
Get #1, 31, bTemp
GetImageSize.Width = byte2long(bTemp(0), bTemp(1))
Get #1, 43, bTemp
GetImageSize.Height = byte2long(bTemp(0), bTemp(1))
Else
'TIF
Debug.Print "\TIF2-2\ "
lPos = byte2long(bTemp(0), bTemp(1)) + byte2long(bTemp(2), bTemp(3)) * 65536 + 11
Get #1, lPos, bTemp
GetImageSize.Width = byte2long(bTemp(0), bTemp(1))
Get #1, lPos + 12, bTemp
GetImageSize.Height = byte2long(bTemp(0), bTemp(1))
End If
End If Close #1
End Function Public Function byte2long(ByVal lsb As Long, ByVal msb As Long) As Long
byte2long = lsb + (msb * 256)
End Function '******************************************************************************************************
'窗口中的代码:
Private Sub Command1_Click()
Dim a As ImageSize
a = GetImageSize( "D:\2.jpg ")
Text1.Text= a.Height & "像素 "
Text2.Text = a.Width & "像素 "
End Sub
'***************************************************************************************************
Public Type ImageSize
Width As Long
Height As Long
End Type Public Function GetImageSize(sFileName As String) As ImageSize
On Error Resume Next
Dim bTemp(3) As Byte, lPos As Long, lFlen As Long
Open sFileName For Binary As #1
lFlen = LOF(1)
Get #1, 1, bTemp()
If bTemp(0) = &H89 And bTemp(1) = &H50 And bTemp(2) = &H4E And bTemp(3) = &H47 Or bTemp(0) = &H42 And bTemp(1) = &H4D Then
Debug.Print "\PNG OR BMP\ "
Get #1, 19, bTemp
GetImageSize.Width = byte2long(bTemp(0), bTemp(1))
Get #1, 23, bTemp
GetImageSize.Height = byte2long(bTemp(0), bTemp(1))
End If
'JPG
If bTemp(0) = &HFF And bTemp(1) = &HD8 And bTemp(2) = &HFF Then
Debug.Print "\JPEG\ "
lPos = 4
Do
Do
Get #1, lPos, bTemp
lPos = lPos + 1
Loop Until (bTemp(0) = &HFF And bTemp(1) <> &HFF) Or lPos > lFlen
Get #1, lPos, bTemp
If bTemp(0) > = &HC0 And bTemp(0) <= &HC3 Then
Get #1, lPos + 4, bTemp
Exit Do
Else
lPos = lPos + (byte2long(bTemp(2), bTemp(1))) + 1
End If
Loop While lPos < lFlen
GetImageSize.Width = byte2long(bTemp(3), bTemp(2))
GetImageSize.Height = byte2long(bTemp(1), bTemp(0))
End If 'GIF file
If bTemp(0) = &H47 And bTemp(1) = &H49 And bTemp(2) = &H46 And bTemp(3) = &H38 Then
Debug.Print "\GIF\ "
Get #1, 7, bTemp
GetImageSize.Width = byte2long(bTemp(0), bTemp(1))
GetImageSize.Height = byte2long(bTemp(2), bTemp(3))
End If
'PSD
If bTemp(0) = &H38 And bTemp(1) = &H42 And bTemp(2) = &H50 And bTemp(3) = &H53 Then
Debug.Print "\PSD\ "
Get #1, 17, bTemp
GetImageSize.Width = byte2long(bTemp(1), bTemp(0))
Get #1, 21, bTemp
GetImageSize.Height = byte2long(bTemp(1), bTemp(0))
End If
'TIF
If bTemp(0) = &H4D And bTemp(1) = &H4D And bTemp(2) = &H0 And bTemp(3) = &H2A Then
Debug.Print "\TIF1\ "
Get #1, 31, bTemp
GetImageSize.Width = byte2long(bTemp(1), bTemp(0))
Get #1, 43, bTemp
GetImageSize.Height = byte2long(bTemp(1), bTemp(0))
End If
If bTemp(0) = &H49 And bTemp(1) = &H49 And bTemp(2) = &H2A And bTemp(3) = &H0 Then
Get #1, 5, bTemp
If bTemp(0) = &H8 And bTemp(1) = &H0 And bTemp(2) = &H0 And bTemp(3) = &H0 Then
'TIF
Debug.Print "\TIF2-1\ "
Get #1, 31, bTemp
GetImageSize.Width = byte2long(bTemp(0), bTemp(1))
Get #1, 43, bTemp
GetImageSize.Height = byte2long(bTemp(0), bTemp(1))
Else
'TIF
Debug.Print "\TIF2-2\ "
lPos = byte2long(bTemp(0), bTemp(1)) + byte2long(bTemp(2), bTemp(3)) * 65536 + 11
Get #1, lPos, bTemp
GetImageSize.Width = byte2long(bTemp(0), bTemp(1))
Get #1, lPos + 12, bTemp
GetImageSize.Height = byte2long(bTemp(0), bTemp(1))
End If
End If Close #1
End Function Public Function byte2long(ByVal lsb As Long, ByVal msb As Long) As Long
byte2long = lsb + (msb * 256)
End Function '******************************************************************************************************
'窗口中的代码:
Private Sub Command1_Click()
Dim a As ImageSize
a = GetImageSize( "D:\2.jpg ")
Text1.Text= a.Height & "像素 "
Text2.Text = a.Width & "像素 "
End Sub
Const MARGIN_SIZE = 1 '边距(厘米)'
Dim pic As IPictureDisp
Set pic = LoadPicture("C:\WINDOWS\Web\Wallpaper\Bliss.bmp")
Printer.PaperSize = vbPRPSA4
Printer.Orientation = IIf(pic.Height > pic.Width, vbPRORPortrait, vbPRORLandscape)
Printer.ScaleMode = vbCentimeters
Printer.PaintPicture pic, MARGIN_SIZE, MARGIN_SIZE, _
Printer.ScaleWidth - MARGIN_SIZE * 2, _
Printer.ScaleHeight - MARGIN_SIZE * 2
Printer.EndDoc
End Sub