我需要知道Linux和Mac OS上的主动屏幕DPI。我认为在Linux的xlib可能是有用的,但我找不到如何得到正确的DPI的方法。 我想要这些信息以英寸得到真实的屏幕尺寸。如何以编程方式获取屏幕DPI(linux,mac)?
在此先感谢!
我需要知道Linux和Mac OS上的主动屏幕DPI。我认为在Linux的xlib可能是有用的,但我找不到如何得到正确的DPI的方法。 我想要这些信息以英寸得到真实的屏幕尺寸。如何以编程方式获取屏幕DPI(linux,mac)?
在此先感谢!
在Linux上的X,叫XOpenDisplay()
得到Display
,然后用DisplayWidthMM()
和DisplayHeightMM()
连同DisplayWidth()
和DisplayHeight()
计算DPI。
在Mac上,几乎可以肯定使用比X更本地的API。默认情况下,Mac OS X不运行X Window,它具有本机窗口环境。
[适用于Mac的答案](http://stackoverflow.com/a/12589799/14558)。 – andrewdotn 2013-06-18 02:15:52
在现代X服务器上,[RandR](http://www.x.org/wiki/Projects/XRandR/)扩展将提供更好的信息。 – elmindreda 2014-03-20 09:44:08
仅供参考[适用于Windows的解决方案](http://stackoverflow.com/questions/577736/how-to-obtain-the-correct-physical-size-of-the-monitor) – 2015-01-16 19:05:21
您可以使用NSScreen
以像素为单位获取所连接显示器的尺寸,但这不会给您显示器的物理尺寸/ PPI,实际上我不认为有任何API将能够可靠地做到这一点。
你可以问一个窗口,它的分辨率,像这样:
NSDictionary* deviceDescription = [window deviceDescription];
NSSize resolution = [[deviceDescription objectForKey:NSDeviceResolution] sizeValue];
目前这会给你的{72,72}
的NSSize
所有页面,不管他们的实际PPI。使这个值发生变化的唯一因素是改变Quartz Debug实用程序中的缩放因子,或者Apple是否打开与分辨率无关的UI。你可以通过调用获得当前的比例因子:
[[NSScreen mainScreen] userSpaceScaleFactor];
如果你真的必须知道确切的分辨率(我很想知道你为什么认为你这样做),你可以创建一个屏幕校准程序,并有用户用实际的物理标尺在屏幕上测量一条线。原油,是的,但它会起作用。
-1答案不回答问题。 – MaxVT 2010-08-08 07:11:24
这是因为回答这个问题是不可能的,这就是我的答案所说的。您无法单独使用软件进行物理上精确的显示测量。我不认为我的答案值得-1。 – 2010-08-17 00:27:36
我从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中编译它,但它给了我一些错误:http://hastebin.com/ocikivubed.pas。有小费吗? – trusktr 2014-10-23 06:44:35
在Mac上,使用CGDisplayScreenSize得到屏幕尺寸以毫米为单位。
这里是一个独立于平台的方式来获得屏幕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。
请注意这一点。新闻部的信息通常不可靠。驱动程序可能会弄错,并且监视EDID信息可能存在,有时很严重。确保有覆盖。 – bobince 2010-04-12 11:53:20