2010-04-12 92 views
9

我需要知道Linux和Mac OS上的主动屏幕DPI。我认为在Linux的xlib可能是有用的,但我找不到如何得到正确的DPI的方法。 我想要这些信息以英寸得到真实的屏幕尺寸。如何以编程方式获取屏幕DPI(linux,mac)?

在此先感谢!

+4

请注意这一点。新闻部的信息通常不可靠。驱动程序可能会弄错,并且监视EDID信息可能存在,有时很严重。确保有覆盖。 – bobince 2010-04-12 11:53:20

回答

6

在Linux上的X,叫XOpenDisplay()得到Display,然后用DisplayWidthMM()DisplayHeightMM()连同DisplayWidth()DisplayHeight()计算DPI。

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

+0

[适用于Mac的答案](http://stackoverflow.com/a/12589799/14558)。 – andrewdotn 2013-06-18 02:15:52

+0

在现代X服务器上,[RandR](http://www.x.org/wiki/Projects/XRandR/)扩展将提供更好的信息。 – elmindreda 2014-03-20 09:44:08

+0

仅供参考[适用于Windows的解决方案](http://stackoverflow.com/questions/577736/how-to-obtain-the-correct-physical-size-of-the-monitor) – 2015-01-16 19:05:21

2

您可以使用NSScreen以像素为单位获取所连接显示器的尺寸,但这不会给您显示器的物理尺寸/ PPI,实际上我不认为有任何API将能够可靠地做到这一点。

你可以问一个窗口,它的分辨率,像这样:

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

目前这会给你的{72,72}NSSize所有页面,不管他们的实际PPI。使这个值发生变化的唯一因素是改变Quartz Debug实用程序中的缩放因子,或者Apple是否打开与分辨率无关的UI。你可以通过调用获得当前的比例因子:

[[NSScreen mainScreen] userSpaceScaleFactor]; 

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

+0

-1答案不回答问题。 – MaxVT 2010-08-08 07:11:24

+0

这是因为回答这个问题是不可能的,这就是我的答案所说的。您无法单独使用软件进行物理上精确的显示测量。我不认为我的答案值得-1。 – 2010-08-17 00:27:36

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); 
} 
+0

我把它粘贴到一个文件中,并试图在OS X中编译它,但它给了我一些错误:http://hastebin.com/ocikivubed.pas。有小费吗? – trusktr 2014-10-23 06:44:35

7

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

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下载此编译罐子。下载后,java -jar dpi.jar会显示你的DPI。

相关问题