将像素转换为点

时间:2020-03-06 14:47:07  来源:igfitidea点击:

我需要将像素转换为C#中的点。我已经看到了有关该主题的一些复杂解释,但似乎找不到简单的公式。让我们假设一个标准的96dpi,如何计算此转换?

解决方案

当然,整个问题应该是:

"如何获取显示器的水平和垂直PPI(每英寸像素)?"

一英寸有72个点(根据定义,"点"定义为英寸的1/72英寸,同样," pica"定义为脚的1/72英寸)。有了这两点信息,我们就可以很容易地从px转换为pt并转换回来。

每英寸有72个点;如果足以假设每英寸96像素,则公式相当简单:

点=像素* 72/96

有一种方法可以使用GetDeviceCaps获取Windows中每英寸显示器的已配置像素。 Microsoft有一个名为"开发可识别DPI的应用程序"的指南,请查找"创建可识别DPI的字体"部分。

无论显示器的实际分辨率如何,W3C都将像素尺寸" px"定义为1英寸的1/96英寸,因此上述公式对所有网络工作都应适用。

假设96dpi是一个巨大的错误。即使假设是正确的,也可以选择缩放字体。因此,为10pts设置的字体实际上可能显示为12.5pt(125%)。

System.Drawing.Graphics具有DpiX和DpiY属性。 DpiX是水平每英寸像素。 DpiY是垂直方向上每英寸的像素。使用那些将点(每英寸72点)转换为像素。

例如:14个水平点=(14 * DpiX)/ 72像素

如果代码采用以下形式,请尝试以下操作:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();

从给定的开始:

  • 一英寸有72个点(即一个点是1/72英寸)
  • 在设置为150dpi的系统上,每英寸有150个像素。
  • 1英寸= 72pt = 150px(用于150dpi设置)

如果要基于像素(px)查找点(pt):

72 pt    x pt
------ = -----                  (1) for 150dpi system
150 px    y px

重新排列:

x = (y/150) * 72                (2) for 150dpi system

所以:

points = (pixels / 150) * 72    (3) for 150dpi system

其实一定是

points = pixels * 96 / 72

高度线转换为点和像素(我自己的公式)。
以下是在"行高"字段中手动输入213.67点的示例:

213.67  Manual Entry    
  0.45  Add 0.45    
214.12  Subtotal    
213.75  Round to a multiple of 0.75 
213.00  Subtract 0.75 provides manual entry converted by Excel  
284.00  Divide by 0.75 gives the number of pixels of height

在这里,手动输入213.67点可获得284像素。
在这里,手动输入213.68点可获得285像素。

(为什么是0.45?我不知道,但是有效。)

WPF使用System.Windows.FontSizeConverter将点转换为像素。 FontSizeConverter使用System.Windows.LengthConverter。 LengthConverter使用因子1.333333333333333333将点(p)转换为像素(x):x = p * 1.3333333333333333