我需要知道 Linux 和 Mac OS 上的活动屏幕 DPI。我认为在 linux xlib 上可能有用,但我找不到获得正确 DPI 的方法。我希望这些信息以英寸为单位获得真实的屏幕尺寸。
提前致谢!
在 Mac 上,使用 CGDisplayScreenSize 获取以毫米为单位的屏幕尺寸。
在 Linux 上的 X 中,调用XOpenDisplay()
以获取Display
,然后将DisplayWidthMM()
和 与 和一起DisplayHeightMM()
使用来计算 DPI。DisplayWidth()
DisplayHeight()
在 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);
}
}
您可以从此处下载已编译的 jar 。下载后java -jar dpi.jar
会显示 DPI。