【问题标题】:Convert Pixels to Points将像素转换为点
【发布时间】:2010-09-13 11:17:28
【问题描述】:

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

【问题讨论】:

    标签: c# .net pixel point


    【解决方案1】:

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

    点 = 像素 * 72 / 96

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

    W3C 已将像素测量 px 定义为与 1/96th of 1in 完全相同,无论您的显示器的实际分辨率如何,因此上述公式应该适用于所有网络工作。

    【讨论】:

    • 每英寸 72 点不是一个有争议的项目,它是一样的!
    • @David dpi 依赖于显示,ppi 是排版常量
    • @David 那篇文章只是解释了为什么显示器具有可变 DPI。 PPI 还是一样的。一英里的公里数不会因您驾驶的汽车而异。假设 96dpi 通常不是一个好主意,但如果我们这样做,那么给定的公式是正确的。
    • 通常 PPI 是每英寸像素的缩写,而不是每英寸点数的缩写。也许这就是混乱的来源?每英寸点数始终为 72;感谢 Xetius 的链接。
    • @Corey Ross:实际上,DPI 将取决于打印机,而 PPI 将取决于监视器。但是每个人都错误地称 PPI DPI...
    【解决方案2】:

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

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

    【讨论】:

    • 是否值得指出 DpiX 用于宽度,而 DpiY 应用于高度?
    【解决方案3】:

    从给定的开始:

    • 一英寸有 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
    

    【讨论】:

    • 第一个等式中的 dpi 应该是 px - 用于取消项,因为我们对 150dpi 系统有假设 (1)
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 请解释一下为什么使用这个值...巧合的是,它是 96 dpi(显示窗口的默认 DPI)/72 dpi(点定义在)。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        当然,整个问题应该是:

        “如何获取显示器的水平和垂直 PPI(Pixels Per Inch)?”

        一英寸有 72 个点(根据定义,“点”定义为 1/72 英寸,“皮卡”定义为 1/72 英尺)。有了这两个位的信息,你就可以很容易地在 px 和 pt 之间进行转换。

        【讨论】:

        • 为了让它变得更加复杂,我正在处理正在转换为 PDF 的 Reporting Services (RDL) 报告上的对齐内容。归根结底,谁知道 DPI 是什么?我正在使用我最好的猜测。 :)
        • 您的意思是“如何获取显示器的水平和垂直 DPI?”。 PPI 是 72 的常数。一直是,而且永远都是。
        • 每英寸像素数,而不是每英寸点数 (Pica)。
        • 嗯,哎呀,不是 Pica!那是 1/6 英寸。 Points Per Inch 是多余的,术语是“Points”。 “点”是 1/72 英寸。
        【解决方案8】:

        其实应该是的

        points = pixels * 96 / 72
        

        【讨论】:

        • 如果您假设 96dpi 和 72ppi(每英寸点数),这是不正确的。它将是点 = 像素 * 72 / 96
        【解决方案9】:

        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

        【讨论】:

          【解决方案10】:

          这行得通:

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

          【讨论】:

            【解决方案11】:

            在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

            【讨论】:

              【解决方案12】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-02-02
                • 2018-10-25
                • 1970-01-01
                • 1970-01-01
                • 2011-09-09
                • 2011-06-04
                • 1970-01-01
                相关资源
                最近更新 更多