【发布时间】:2010-04-12 10:55:28
【问题描述】:
我需要了解 Linux 和 Mac OS 上的活动屏幕 DPI。我认为在 linux xlib 上可能有用,但我找不到如何获得正确 DPI 的方法。 我希望这些信息以英寸为单位获得真实的屏幕尺寸。
提前致谢!
【问题讨论】:
-
小心这个。 DPI 信息通常不可靠。司机可能会弄错,监控器的 EDID 信息可能会撒谎,有时甚至很严重。确保有一个覆盖。
我需要了解 Linux 和 Mac OS 上的活动屏幕 DPI。我认为在 linux xlib 上可能有用,但我找不到如何获得正确 DPI 的方法。 我希望这些信息以英寸为单位获得真实的屏幕尺寸。
提前致谢!
【问题讨论】:
在 Mac 上,使用 CGDisplayScreenSize 获取以毫米为单位的屏幕尺寸。
【讨论】:
在 Linux 上的 X 中,调用 XOpenDisplay() 以获取 Display,然后使用 DisplayWidthMM() 和 DisplayHeightMM() 与 DisplayWidth() 和 DisplayHeight() 一起计算 DPI。
在 Mac 上,几乎可以肯定有比 X 更原生的 API 可供使用。Mac OS X 默认不运行 X Window,它有一个原生窗口环境。
【讨论】:
我是从 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);
}
【讨论】:
您可以使用NSScreen 获取附加显示器的尺寸(以像素为单位),但这不会为您提供显示器的物理尺寸/PPI,事实上我认为没有任何 API这将能够可靠地做到这一点。
您可以像这样询问窗口的分辨率:
NSDictionary* deviceDescription = [window deviceDescription];
NSSize resolution = [[deviceDescription objectForKey:NSDeviceResolution] sizeValue];
目前这将为您提供所有屏幕的NSSize 或{72,72},无论它们的实际PPI 是多少。唯一改变这个值的就是改变 Quartz Debug 实用程序中的比例因子,或者如果 Apple 曾经打开与分辨率无关的 UI。您可以通过调用获取当前比例因子:
[[NSScreen mainScreen] userSpaceScaleFactor];
如果您真的必须知道确切的分辨率(我很想知道您为什么这么认为),您可以创建一个屏幕校准例程,让用户使用实际的物理标尺在屏幕上测量一条线。粗略,是的,但它会起作用。
【讨论】:
这是获取屏幕 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。
【讨论】: