【发布时间】:2010-09-13 11:17:28
【问题描述】:
我需要在 C# 中将像素转换为点。我看过一些关于这个话题的复杂解释,但似乎找不到一个简单的公式。我们假设一个标准的 96dpi,我如何计算这个转换?
【问题讨论】:
我需要在 C# 中将像素转换为点。我看过一些关于这个话题的复杂解释,但似乎找不到一个简单的公式。我们假设一个标准的 96dpi,我如何计算这个转换?
【问题讨论】:
有72 points per inch;如果假设每英寸 96 个像素就足够了,那么公式就相当简单了:
点 = 像素 * 72 / 96
有一种方法可以使用GetDeviceCaps 在 Windows 中获取配置的每英寸显示器像素数。 Microsoft 有一个名为 "Developing DPI-Aware Applications" 的指南,请查找“创建 DPI 感知字体”部分。
W3C 已将像素测量 px 定义为与 1/96th of 1in 完全相同,无论您的显示器的实际分辨率如何,因此上述公式应该适用于所有网络工作。
【讨论】:
如果您的代码位于表单中,请尝试以下操作:
Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
【讨论】:
从给定的开始:
如果要根据像素(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
【讨论】:
假设 96dpi 是一个巨大的错误。即使假设是正确的,也可以选择缩放字体。因此,为 10pts 设置的字体实际上可能会显示为 12.5pt (125%)。
【讨论】:
WPF 使用 System.Windows.FontSizeConverter 将点转换为像素。 FontSizeConverter 使用 System.Windows.LengthConverter。 LengthConverter 使用因子 1.333333333333333333 将点 (p) 转换为像素 (x):x = p * 1.3333333333333333
【讨论】:
System.Drawing.Graphics 具有 DpiX 和 DpiY 属性。 DpiX 是水平方向每英寸的像素数。 DpiY 是垂直每英寸的像素数。使用这些将点(每英寸 72 点)转换为像素。
例如:14 个水平点 = (14 * DpiX) / 72 像素
【讨论】:
当然,整个问题应该是:
“如何获取显示器的水平和垂直 PPI(Pixels Per Inch)?”
一英寸有 72 个点(根据定义,“点”定义为 1/72 英寸,“皮卡”定义为 1/72 英尺)。有了这两个位的信息,你就可以很容易地在 px 和 pt 之间进行转换。
【讨论】:
其实应该是的
points = pixels * 96 / 72
【讨论】:
points = (pixels / 96) * 72 在标准 XP/Vista/7 机器上(出厂默认值)
points = (pixels / 72) * 72 在运行 OSX 的标准 Mac 上(出厂默认设置)
Windows 默认以 96dpi(显示)运行 Mac 默认以 72 dpi(显示)运行
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 = 16 像素 * 8 像素/16 = em
【讨论】:
这行得通:
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
【讨论】:
在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
因此,公式为:
points: int = (pixelNumber * 72) // 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?我不知道,但它有效。)
【讨论】: