131

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

4

12 回答 12

216

每英寸有72个点;如果假设每英寸 96 个像素就足够了,那么公式就相当简单:

点 = 像素 * 72 / 96

有一种方法可以在 Windows 中使用GetDeviceCaps. Microsoft 有一个名为“Developing DPI-Aware Applications”的指南,请查看“Creating DPI-Aware Fonts”部分。

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

于 2008-09-26T14:04:53.193 回答
59

如果您的代码位于以下表格中,请尝试此操作:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
于 2009-07-03T12:06:29.113 回答
26

从给定的开始:

  • 一英寸有 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
于 2009-08-10T17:55:26.240 回答
25

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

于 2008-09-26T14:06:25.093 回答
9

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

于 2010-09-02T18:44:34.600 回答
5

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

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

于 2008-09-26T14:45:19.430 回答
4

当然,整个问题应该是:

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

一英寸有 72 个点(根据定义,“点”定义为 1/72 英寸,“皮卡”定义为 1/72 英尺)。有了这两位信息,您可以非常轻松地从 px 转换为 pt 并返回。

于 2008-09-26T13:59:51.617 回答
4

其实应该是

points = pixels * 96 / 72
于 2010-07-12T12:02:07.387 回答
4

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

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

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

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

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

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

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

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

于 2011-08-25T20:55:40.227 回答
1

这有效:

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
于 2016-08-07T05:12:38.243 回答
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

于 2020-07-08T19:26:20.173 回答
-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?我不知道,但它有效。)

于 2010-08-16T22:57:10.617 回答