Как получить экран DPI (Linux, Mac) программно? - PullRequest
9 голосов
/ 12 апреля 2010

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

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

Ответы [ 5 ]

8 голосов
/ 18 июня 2011

На компьютере Mac используйте CGDisplayScreenSize, чтобы получить размер экрана в миллиметрах.

6 голосов
/ 12 апреля 2010

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

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

4 голосов
/ 08 августа 2010

Я собрал это вместе из 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);
}
2 голосов
/ 12 апреля 2010

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

Вы можете запросить у окна разрешение:

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

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

[[NSScreen mainScreen] userSpaceScaleFactor];

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

1 голос
/ 15 ноября 2015

Вот независимый от платформы способ получить разрешение экрана:

// 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.

...