跳到主要内容

Excel VBA 中像素、磅、英寸、厘米之间的转换

英寸(inch)是一种长度单位,通常用于衡量较小的物体的大小,例如屏幕尺寸、手机尺寸等。磅(Point,缩写为 pt)是一种常见的印刷单位,通常用于表示文字的大小。像素(Pixel)是组成数字图像的最基本的图像单元。

英寸、厘米、磅之间的互换

英寸、厘米、磅之间可以直接进行互换:

1 英寸(inch)= 2.54 厘米(cm)= 72 磅(point)

1 磅(point)= 1/72 英寸(inch)= 2.54/72 厘米(cm)≈ 0.035 厘米(cm)

1 厘米(cm)= 1/2.54 英寸(inch)= 72/2.54 磅(point)≈ 28.35 磅(point)

1 米(m)= 100 厘米(cm) = 1000 毫米(mm)

在 VBA 中,可以使用 Application 对象的 InchesToPoints 方法CentimetersToPoints 方法可将英寸和厘米换算为磅。

将英寸换算为磅:

' 换算1英寸等于72磅
Debug.Print Application.InchesToPoints(1)

将厘米换算为磅:

' 换算1厘米约等于28.35磅
Debug.Print Application.CentimetersToPoints(1)

除了使用 VBA 自带函数,还可以使用自定义函数来相互换算:

Function Point2Inch(ByVal dPoint As Double)
    ' Point 转 Inch
    Point2Inch = dPoint / 72
End Function

Function Inch2Point(ByVal dInch As Double)
    ' Inch 转 Point
    Inch2Point = dInch * 72
End Function

Function Point2Centimeters(ByVal dPoint As Double)
    ' Point 转 Centimeter
    Point2Centimeters = dPoint / 72 * 2.54
End Function

Function Centimeters2Point(ByVal dCentimeter As Double)
    ' Centimeter 转 Point
    Centimeters2Point = dCentimeter * 72 / 2.54
End Function

像素、磅之间的互换

在 Excel VBA 中,许多有关长度的单位都是磅,比如单元格的行高,Shape 对象的长宽等。要将像素转换为磅需要考虑屏幕像素密度,像素转换为磅的公式如下:

磅数 = 像素数 / 屏幕像素密度 * 72

像素数 = 磅数 * 屏幕像素密度 / 72

其中,屏幕像素密度(PPI, pixels per inch)表示每英寸的像素数,可以使用 VBA 得到当前屏幕的 PPI,详见:使用 VBA 获取屏幕分辨率 PPI。例如,假设一个屏幕的像素密度为 200 PPI,我们要将 24 像素的元素转换为磅数,则磅数为:

磅数 = 24 / 200 * 72 = 8.64 磅

DPI (Dots Per Inch) 是指每英寸内打印或印刷出的点数,即在一英寸线性长度上能打印或印刷出的点的数量。比如,在 Word 中默认的像素和磅的换算关系为 96 DPI(dots per inch),即每英寸 96 个像素。根据这个换算关系,我们可以将像素转换为磅:

磅数 = 像素数 / 96 * 72

我们可以使用自定义函数来实现像素、磅之间的互换代码如下:

#If VBA7 And Win64 Then
    Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As Long
    Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As LongPtr, ByVal hDC As Long) As Long
    Declare PtrSafe Function GetDeviceCaps Lib "Gdi32" (ByVal hDC As LongPtr, ByVal index As Long) As Long
#Else
    Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
    Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
    Declare Function GetDeviceCaps Lib "Gdi32" (ByVal hDC As Long, ByVal index As Long) As Long
#End If

Function PPI()
    Dim hDC As Long
    ' 获取句柄
    hDC = GetDC(0)
    Dim PPIX, PPIY
    ' 屏幕水平PPI
    PPIX = GetDeviceCaps(hDC, 88) 'LOGPIXELSX = 88
    ' 屏幕垂直PPI
    PPIY = GetDeviceCaps(hDC, 90) 'LOGPIXELSY = 90
    PPI = PPIX
    ' 释放句柄
    ReleaseDC 0, hDC
End Function

Function Point2Pixel(ByVal dPoint As Double)
    ' Point转Pixel
    ' PPI为每英寸像素数,由自定义函数 PPI 得到
    Point2Pixel = dPoint / 72 * PPI
End Function

Function Pixel2Point(ByVal dPixel As Double)
    ' Pixel转Point
    ' PPI为每英寸像素数,由自定义函数 PPI 得到
     Pixel2Point = dPixel * 72 / PPI
End Function

评论

您的电子邮件地址不会显示出来。*号为必填项。