如何以编程方式获取屏幕DPI(linux,mac)?

时间:2010-04-12 10:55:28

标签: linux macos screen dpi

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

提前致谢!

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

我从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);
}

答案 3 :(得分:2)

您可以使用NSScreen来获取所连接的显示器的尺寸(以像素为单位),但这不会显示显示器的物理尺寸/ PPI,事实上我认为没有任何能够可靠地执行此操作的API。

你可以问一个窗口的分辨率如下:

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

目前,无论实际PPI如何,这都会为所有屏幕提供NSSize {72,72}。唯一能使这个值发生变化的是改变Quartz Debug实用程序中的缩放因子,或者Apple是否打开了与分辨率无关的UI。您可以通过调用:

获取当前比例因子
[[NSScreen mainScreen] userSpaceScaleFactor];

如果你真的必须知道确切的分辨率(并且我有兴趣知道你为什么这么做),你可以创建一个屏幕校准例程,并让用户在屏幕上用实际的物理标尺测量一条线。原油,是的,但它会起作用。

答案 4 :(得分:1)

这是一种独立于平台的获取屏幕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。