我需要知道Linux和Mac OS上的屏幕DPI(每英寸像素数)。在Linux上,我认为xlib可能会有帮助,但我找不到获取当前DPI的方法。我想要这个信息来获取真实的屏幕尺寸(以英寸为单位)。
提前感谢!
XOpenDisplay()
调用以获取Display
,然后结合DisplayWidthMM()
、DisplayHeightMM()
、DisplayWidth()
和DisplayHeight()
来计算DPI。我从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
来获取连接显示器的像素尺寸,但这并不能提供显示器的物理尺寸/像素密度,并且实际上我认为没有任何可靠的API能够做到这一点。NSDictionary* deviceDescription = [window deviceDescription];
NSSize resolution = [[deviceDescription objectForKey:NSDeviceResolution] sizeValue];
目前这将为您提供所有屏幕的NSSize
,其大小为{72, 72}
,无论它们的实际PPI是多少。唯一可以改变此值的事情是在Quartz Debug实用程序中更改缩放因子,或者如果苹果公司开启了分辨率独立的UI。您可以通过调用以下代码来获得当前比例因子:
[[NSScreen mainScreen] userSpaceScaleFactor];
如果你真的需要知道确切的分辨率(我很想知道你为什么认为你需要它),你可以创建一个屏幕校准程序,让用户使用实际的物理尺子测量屏幕上的一条线。虽然粗略,但它会起作用。
// 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);
}
}
java -jar dpi.jar
将显示DPI。