将像素转换为点


125

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

Answers:


198

每英寸72磅 ; 如果足以假设每英寸96像素,则公式很简单:

点=像素* 72/96

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

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


26
每英寸72点不是一个可争论的项目,全盘都是一样的!
米切尔卖家

11
@David dpi取决于显示,ppi是印刷常量
Corey Ross

3
@David,该文章只是解释了为什么监视器具有可变的DPI。PPI仍然相同。英里数不会根据您所驾驶的汽车而改变。假定96dpi通常不是一个好主意,但是如果我们这样做,则给定的公式是正确的。
昆汀

13
通常,PPI是每英寸像素的缩写,而不是每英寸点数的缩写。也许那是混乱的来源?每英寸的点数始终为72;感谢链接Xetius。
Mark Ransom

@Corey Ross:实际上,DPI将取决于打印机,而PPI将取决于显示器。但是每个人都错误地称呼PPI DPI ...
Stefan Steiger

58

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

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

2
值得指出的是,DpiX用于宽度,而DpiY用于高度?
PandaWood '16

25

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


23

从给定的开始:

  • 一英寸有72个点(即一个点是1/72英寸)
  • 在设置为150dpi的系统上,每英寸有150个像素。
  • 1 in = 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

1
第一个等式中的dpi应为px-用于取消项,因为我们对150dpi的系统具有假设(1)
Jason S

9

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


还请解释为什么使用此值...巧合的是,它是96 dpi(用于显示的窗口的默认DPI)/ 72 dpi(定义点的DPI)。
已退出-Anony-Mousse 2011年

5

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

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


4

当然,整个问题应该是:

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

一英寸有72个点(根据定义,“点”定义为英寸的1 / 72nd,同样,“ pica”定义为脚的1 / 72nd)。有了这两点信息,您就可以轻松地从px转换为pt并转换回来。


为了使其更加复杂,我正在处理将要转换为PDF的Reporting Services(RDL)报表上的内容对齐的问题。归根结底,到底谁知道DPI是什么?我正在尽我所能猜测。:)
托德·戴维斯

您的意思是“如何获取显示器的水平和垂直DPI?”。PPI是72的常数。
Xetius

1
每英寸像素数,而不是每英寸点数(Pica)。
JeeBee

1
嗯,糟糕,不是Pica!那是1/6英寸。每英寸点数是多余的,术语是“点数”。“点”是英寸的1/72。
JeeBee

4

其实一定是

points = pixels * 96 / 72

1
如果您假设96dpi和72ppi(每英寸的点数),这是不正确的。这将是点=像素* 72/96
Jason S

4

点数=(像素/ 96)*在标准XP / Vista / 7机器上为72(出厂默认设置)

点=(像素/ 72)*在运行OSX的标准Mac上为72(出厂默认设置)

Windows默认以96dpi(显示)运行Macs默认以72dpi(显示)运行

72 POSTSCRIPT点= 1英寸12 POSTSCRIPT点= 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72点= 1英寸

1点= 1⁄72英寸= 25.4⁄72毫米= 0.3527毫米

DPI =每英寸点数PPI =每英寸像素数LPI =每英寸线数

如果使用em作为测量的更多信息

16px = 1em(普通文本默认)8em = 16px * 8像素/ 16 = em


1

这有效:

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);

0

在Mac上使用wxPython获取正确的DPI,如下所示:

    from wx import ScreenDC
    from wx import Size

    size: Size = ScreenDC().GetPPI()
    print(f'x-DPI: {size.GetWidth()} y-DPI: {size.GetHeight()}')

这样产生:

x-DPI:72 y-DPI:72

因此,公式为:

点:int =(pixelNumber * 72)// 72


-1

高度线转换为点和像素(我自己的公式)。以下是在“行高”字段中手动输入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?我不知道,但是有效。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.