Как получить экран DPI (Linux, Mac) программно?

Я должен знать активный экран DPI on Linux и Mac OS. Я думаю на Linux xlib, могло бы быть полезным, но я не могу найти путь, как получить currect DPI. Я хочу, чтобы эта информация получила реальный размер экрана в дюймах.

Заранее спасибо!

8
задан k3a 12 April 2010 в 10:55
поделиться

3 ответа

В X в Linux вызовите XOpenDisplay () , чтобы получить Display , затем используйте DisplayWidthMM () и DisplayHeightMM () вместе с DisplayWidth () и DisplayHeight () для вычисления DPI.

На Mac почти наверняка есть более собственный API, чем X. Mac OS X не запускает X Window по умолчанию, у нее есть собственная оконная среда.

6
ответ дан 5 December 2019 в 07:57
поделиться

Вы можете использовать NSScreen , чтобы получить размеры подключенных дисплеев в пикселях, но это не даст вам физический размер / PPI дисплея, и на самом деле я не думаю, что есть какие-либо API, которые смогут сделать это надежно.

Вы можете запросить разрешение окна следующим образом:

NSDictionary* deviceDescription = [window deviceDescription];
NSSize resolution = [[deviceDescription objectForKey:NSDeviceResolution] sizeValue];

В настоящее время это даст вам NSSize из {72,72} для всех экранов, независимо от их фактический PPI. Единственное, что меняет это значение, - это изменение коэффициента масштабирования в утилите Quartz Debug, или если Apple когда-либо включит пользовательский интерфейс, не зависящий от разрешения.Вы можете получить текущий масштабный коэффициент, позвонив:

[[NSScreen mainScreen] userSpaceScaleFactor];

Если вам действительно нужно знать точное разрешение (а мне было бы интересно узнать, почему вы так думаете), вы можете создать процедуру калибровки экрана и попросить пользователя измерить линия на экране с реальной физической линейкой. Грубый, да, но он будет работать.

2
ответ дан 5 December 2019 в 07:57
поделиться

Я собрал это вместе из 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);
}
4
ответ дан 5 December 2019 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: