如何在vba中实现Pixel像素、Point磅、Inch英寸、Centimeter厘米之间的相互转换?

在vba中,许多关于长宽的属性的返回值都是以Points为单位的。

比如Range对象的Height属性返回以Points为单位表示的单元格的行高。

那么,这个Points到底是指什么呢?

根据维基百科的解释,在印刷行业中,Point是最小的度量单位。

在印刷行业的历史上,Point的大小一直在变。

现在一般规定,1 Point =1/72inch。

inch是长度单位,1 Inch= 2.54 cm

在vba中,可以使用Application对象的InchesToPointsCentimetersToPoints方法进行inch、Point和Centimeter之间的相互转换。

如以下的代码都将返回1 Point:

Sub QQ1722187970()
    Debug.Print Excel.Application.InchesToPoints(1 / 72)
    Debug.Print Excel.Application.CentimetersToPoints(2.54 * 1 / 72)
End Sub

像素(Pixel)是显示器、数字相机或扫描仪可以分辨的最小的点,它是度量数字图像的基本单位。

如果要将Pixel与Point、Inch进行转换,还需要知道PPI的值。

PPI:Pixels Per Inch也叫像素密度,所表示的是每英寸所拥有的像素数量。

目前主流的电脑显示器的PPI一般有72、96、120这3种。

有了PPI的值,就可以在Pixel、Point、InchCentimeter之间进行相互转换。

以下是6个vba自定义函数,分别可以实现Pixel、Point、Inch、Centimeter之间的相互转换:

Function Point2Inch(ByVal dPoint As Double)
    'Point转Inch
    Point2Inch = dPoint * 1 / 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 * 1 / 72 * 2.54
End Function
Function Centimeters2Point(ByVal dCentimeter As Double)
    'Centimeter转Point
    Centimeters2Point = dCentimeter * 72 * 1 / 2.54
End Function
Function Point2Pixel(ByVal dPoint As Double, ByVal iPPI As Integer)
    'Point转Pixel
    'iPPI参数为每英寸像素数
    Point2Pixel = dPoint * 1 / 72 * iPPI
End Function
Function Pixel2Point(ByVal dPixel As Double, ByVal iPPI As Integer)
    'Pixel转Point
    'iPPI参数为每英寸像素数
     Pixel2Point = dPixel * 72 / iPPI
End Function

其中Pixel转Point或者Point转Pixel需要知道PPI,在如何用vba获取屏幕显示器每英寸包含的像素数目ppi?一文中我们介绍了如何获取PPI。

以下是获取屏幕显示器PPI的自定义函数:

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
Const LOGPIXELSX = 88
Const LOGPIXELSY = 90
Function GetPPI()
    Dim hDC As Long
    hDC = GetDC(0)
    Dim X, Y
    X = GetDeviceCaps(hDC, LOGPIXELSX)
    Y = GetDeviceCaps(hDC, LOGPIXELSY)
    GetPPI = X
End Function
       

仅有1条评论 发表评论

  1. dwlde123 /

    请问在视图比例不是100的时候,磅转为像素会出错,怎么解决呢?

发表评论