Я должен знать активный экран DPI on Linux и Mac OS. Я думаю на Linux xlib, могло бы быть полезным, но я не могу найти путь, как получить currect DPI. Я хочу, чтобы эта информация получила реальный размер экрана в дюймах.
Заранее спасибо!
В X в Linux вызовите XOpenDisplay ()
, чтобы получить Display
, затем используйте DisplayWidthMM ()
и DisplayHeightMM ()
вместе с DisplayWidth ()
и DisplayHeight ()
для вычисления DPI.
На Mac почти наверняка есть более собственный API, чем X. Mac OS X не запускает X Window по умолчанию, у нее есть собственная оконная среда.
Вы можете использовать NSScreen
, чтобы получить размеры подключенных дисплеев в пикселях, но это не даст вам физический размер / PPI дисплея, и на самом деле я не думаю, что есть какие-либо API, которые смогут сделать это надежно.
Вы можете запросить разрешение окна следующим образом:
NSDictionary* deviceDescription = [window deviceDescription];
NSSize resolution = [[deviceDescription objectForKey:NSDeviceResolution] sizeValue];
В настоящее время это даст вам NSSize
из {72,72}
для всех экранов, независимо от их фактический PPI. Единственное, что меняет это значение, - это изменение коэффициента масштабирования в утилите Quartz Debug, или если Apple когда-либо включит пользовательский интерфейс, не зависящий от разрешения.Вы можете получить текущий масштабный коэффициент, позвонив:
[[NSScreen mainScreen] userSpaceScaleFactor];
Если вам действительно нужно знать точное разрешение (а мне было бы интересно узнать, почему вы так думаете), вы можете создать процедуру калибровки экрана и попросить пользователя измерить линия на экране с реальной физической линейкой. Грубый, да, но он будет работать.
Я собрал это вместе из 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);
}