2010-04-12 10 views
9

Ho bisogno di conoscere DPI dello schermo attivo su Linux e Mac OS. Penso che su linux xlib potrebbe essere utile, ma non riesco a trovare un modo per ottenere DPI DPI. Desidero che queste informazioni ottengano le dimensioni reali dello schermo in pollici.Come ottenere DPI dello schermo (linux, mac) in modo programmato?

Grazie in anticipo!

+4

Stai attento a questo. Le informazioni DPI non sono generalmente affidabili. I driver possono sbagliare e monitorare le informazioni EDID possono mentire, a volte grossolanamente. Assicurati che ci sia un override. – bobince

risposta

6

In X su Linux, chiamata XOpenDisplay() per ottenere il Display, quindi utilizzare DisplayWidthMM() e DisplayHeightMM() insieme DisplayWidth() e DisplayHeight() per calcolare il DPI.

Sul Mac, c'è quasi sicuramente un'API nativa da utilizzare rispetto a X. Mac OS X non esegue X Window per impostazione predefinita, ha un ambiente di finestre nativo.

+0

[Answer per Mac] (http://stackoverflow.com/a/12589799/14558). – andrewdotn

+0

Su un server X moderno, l'estensione [RandR] (http://www.x.org/wiki/Projects/XRandR/) fornirà informazioni migliori. – elmindreda

+0

FYI [Answer for Windows] (http://stackoverflow.com/questions/577736/how-to-obtain-the-correct-physical-size-of-the-monitor) –

2

È possibile utilizzare NSScreen per ottenere le dimensioni del/i display/i allegato/i in pixel, ma questo non ti darà la dimensione fisica/PPI del display e infatti non credo ci siano API che sarà in grado di farlo in modo affidabile.

Si può chiedere una finestra per la sua risoluzione in questo modo:

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

Questo vi attualmente vi darà un NSSize di {72,72} per tutti gli schermi, non importa quale sia la loro effettiva PPI. L'unica cosa che modifica questo valore è la modifica del fattore di scala nell'utilità Debug di quarzo o se Apple attiva l'interfaccia utente indipendente dalla risoluzione. È possibile ottenere il fattore di scala corrente chiamando:

[[NSScreen mainScreen] userSpaceScaleFactor]; 

Se davvero necessario conoscere l'esatta risoluzione (e sarei interessato a sapere il motivo per cui si pensa di fare), è possibile creare una routine di calibrazione dello schermo e hanno l'utente misura una linea sullo schermo con un righello fisico reale. Greggio, sì, ma funzionerà.

+0

-1 La risposta non risponde alla domanda. – MaxVT

+0

Questo perché rispondere alla domanda non è possibile, che è quello che dice la mia risposta. NON È POSSIBILE ottenere una misurazione fisica accurata dello schermo utilizzando solo il software. Non penso che la mia risposta meritasse un -1. –

4

ho acciottolata questo insieme da xdpyinfo ... Compilare con: 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); 
} 
+0

Ho incollato questo in un file e ho cercato di compilarlo in OS X, ma mi dà alcuni errori: http://hastebin.com/ocikivubed.pas. Qualche consiglio? – trusktr

7

su un Mac, utilizzare CGDisplayScreenSize per ottenere la dimensione dello schermo in millimetri.

1

Ecco una piattaforma modo autonomo per ottenere il DPI schermo:

// 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); 
    } 

} 

È possibile scaricare un barattolo compilata di questo da here. Dopo il download, java -jar dpi.jar ti mostrerà il DPI.

Problemi correlati