【问题标题】:How to get screen DPI (linux,mac) programatically?如何以编程方式获取屏幕 DPI(linux、mac)?
【发布时间】:2010-04-12 10:55:28
【问题描述】:

我需要了解 Linux 和 Mac OS 上的活动屏幕 DPI。我认为在 linux xlib 上可能有用,但我找不到如何获得正确 DPI 的方法。 我希望这些信息以英寸为单位获得真实的屏幕尺寸。

提前致谢!

【问题讨论】:

  • 小心这个。 DPI 信息通常不可靠。司机可能会弄错,监控器的 EDID 信息可能会撒谎,有时甚至很严重。确保有一个覆盖。

标签: linux macos screen dpi


【解决方案1】:

在 Mac 上,使用 CGDisplayScreenSize 获取以毫米为单位的屏幕尺寸。

【讨论】:

    【解决方案2】:

    在 Linux 上的 X 中,调用 XOpenDisplay() 以获取 Display,然后使用 DisplayWidthMM()DisplayHeightMM()DisplayWidth()DisplayHeight() 一起计算 DPI。

    在 Mac 上,几乎可以肯定有比 X 更原生的 API 可供使用。Mac OS X 默认不运行 X Window,它有一个原生窗口环境。

    【讨论】:

    • 在现代 X 服务器上,RandR 扩展将提供更好的信息。
    • 仅供参考Answer for Windows
    • 仅供参考:使用 X11,硬件 DPI 经常会被计算错误(尤其是当 X11 有多个屏幕时) - 在编写应用程序时,您应该尝试尊重用户的请求 -请参阅 Xft.dpi。
    【解决方案3】:

    我是从 xdpyinfo 拼凑出来的... 编译:gcc -Wall -o getdpi getdpi.c -lX11

    /* Get dots per inch 
     */
    static void get_dpi(int *x, int *y)
    {
        double xres, yres;
        Display *dpy;
        char *displayname = NULL;
        int scr = 0; /* Screen number */
    
        if( (NULL == x) || (NULL == y)){ return ; }
    
        dpy = XOpenDisplay (displayname);
    
        /*
         * there are 2.54 centimeters to an inch; so there are 25.4 millimeters.
         *
         *     dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch))
         *         = N pixels / (M inch / 25.4)
         *         = N * 25.4 pixels / M inch
         */
        xres = ((((double) DisplayWidth(dpy,scr)) * 25.4) / 
            ((double) DisplayWidthMM(dpy,scr)));
        yres = ((((double) DisplayHeight(dpy,scr)) * 25.4) / 
            ((double) DisplayHeightMM(dpy,scr)));
    
        *x = (int) (xres + 0.5);
        *y = (int) (yres + 0.5);
    
        XCloseDisplay (dpy);
    }
    

    【讨论】:

    • 我将它粘贴到一个文件中并尝试在 OS X 中编译它,但它给了我一些错误:hastebin.com/ocikivubed.pas。有什么建议吗?
    【解决方案4】:

    您可以使用NSScreen 获取附加显示器的尺寸(以像素为单位),但这不会为您提供显示器的物理尺寸/PPI,事实上我认为没有任何 API这将能够可靠地做到这一点。

    您可以像这样询问窗口的分辨率:

    NSDictionary* deviceDescription = [window deviceDescription];
    NSSize resolution = [[deviceDescription objectForKey:NSDeviceResolution] sizeValue];
    

    目前这将为您提供所有屏幕的NSSize{72,72},无论它们的实际PPI 是多少。唯一改变这个值的就是改变 Quartz Debug 实用程序中的比例因子,或者如果 Apple 曾经打开与分辨率无关的 UI。您可以通过调用获取当前比例因子:

    [[NSScreen mainScreen] userSpaceScaleFactor];
    

    如果您真的必须知道确切的分辨率(我很想知道您为什么这么认为),您可以创建一个屏幕校准例程,让用户使用实际的物理标尺在屏幕上测量一条线。粗略,是的,但它会起作用。

    【讨论】:

    • 那是因为无法回答这个问题,这就是我的回答。仅使用软件无法对显示器进行物理精确测量。我认为我的回答不值得 -1。
    【解决方案5】:

    这是获取屏幕 DPI 的独立于平台的方法:

    // Written in Java
    import java.awt.Toolkit;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.border.EmptyBorder;
    
    public final class DpiTest {
    
        public static void main(String[] args) {
            JFrame frame = new JFrame("DPI");
            JLabel label = new JLabel("Current Screen DPI: " + Toolkit.getDefaultToolkit().getScreenResolution());
            label.setBorder(new EmptyBorder(20, 20, 20, 20));
            frame.add(label);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    
    }
    

    您可以从here 下载已编译的 jar。下载后java -jar dpi.jar会显示DPI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多