将像素转换为点数

136

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

12个回答

220

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

点数 = 像素 * 72 / 96

在Windows中有一种方法可以使用GetDeviceCaps获得显示器的配置像素每英寸。 Microsoft有一个名为"Developing DPI-Aware Applications"的指南,请查找“Creating DPI-Aware Fonts”部分。

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


26
每英寸72点并不容置疑,这在各个领域都是一样的! - Mitchel Sellers
11
DPI取决于显示器,而PPI是一个印刷行业的常量。 - Corey Ross
3
@David那篇文章只是解释了为什么显示器有可变DPI,而PPI仍然是一样的。一英里里的公里数不会因为你开的车不同而改变。假设96dpi通常不是一个好主意,但如果我们这样做,那么给定的公式是正确的。 - Quentin
14
通常情况下,“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();

3
指出DpiX适用于宽度,而应该使用DpiY用于高度,这样做值得吗? - PandaWood

25

根据给定信息:

  • 一英寸有72个点(一个点等于1/72英寸)
  • 在一个设置为150dpi的系统中,每英寸有150个像素
  • 对于150dpi的设置,1英寸=72pt=150px

如果你想基于像素(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

25

假设96dpi是一个巨大的错误。即使这个假设是正确的,也有一种字体缩放选项。因此,设计为10磅的字体实际上可能显示为12.5磅(125%)。


8

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


请解释为什么使用这个值...巧合的是,它是96 dpi(Windows显示器的默认DPI)/ 72 dpi(点被定义的DPI)。 - Has QUIT--Anony-Mousse

4

System.Drawing.Graphics 有 DpiX 和 DpiY 属性。DpiX 表示水平每英寸像素数,DpiY 表示垂直每英寸像素数。使用它们将点数(每英寸72个点)转换为像素。

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


3

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

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

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

72 POSTSCRIPT点=1英寸 12 POSTSCRIPT点=1 POSTSCRIPT字体 6 POSTSCRIPT字体=72点=1英寸

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

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

如果使用em作为测量单位,请参考以下信息

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


3
实际上,它必须是这样的。
points = pixels * 96 / 72

1
如果您假定96dpi和72ppi(每英寸点数),则此内容是不正确的。正确的公式应该是:points = pixels * 72 / 96。 - Jason S

3

这个问题应该是:

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

1英寸有72个点(按定义,“点”被定义为1/72英寸,同样,“派卡”被定义为1/72英尺)。有了这两个信息,您可以非常容易地在px和pt之间进行转换。


为了让事情变得更加复杂,我正在处理对齐Reporting Services(RDL)报告中的内容,该报告将被转换为PDF。到最后,谁知道DPI是多少呢?我只能尽力猜测。 :) - Todd Davis
你的意思是“我如何获取显示器的水平和垂直DPI?”PPI是一个恒定值为72。一直都是这样,也永远不会改变。 - Xetius
1
每英寸像素数,而不是每英寸点数(Pica)。 - JeeBee
1
哎呀,糟糕,不是Pica!那是1/6英寸。每英寸点数是多余的,术语应该是“点”。一个“点”是1/72英寸。 - JeeBee

1
这个可以工作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接