10
votes

Comment obtenir l'écran DPI (Linux, Mac) Programmatiquement?

J'ai besoin de connaître l'écran actif DPI sur Linux et Mac OS. Je pense que sur Linux XLib pourrait être utile, mais je ne trouve pas comment obtenir le DPI de CODRECT. Je veux que ces informations obtiennent une taille réelle de l'écran en pouces.

Merci d'avance!


1 commentaires

Soyez prudent avec cela. Les informations DPI ne sont généralement pas fiables. Les conducteurs peuvent vous tromper et que les informations EDID des moniteurs puissent mentir, parfois grossièrement. Assurez-vous qu'il y a un remplacement.


5 Réponses :


6
votes

in x sur Linux, appelez xopendisplay () pour obtenir le affichage , puis utiliser displaywidthmm () et displayheighmm () avec displaywidth () et displayheight () pour calculer le dpi.

sur le Mac, il y a presque certainement une API plus native à utiliser que X. Mac OS X n'exécute pas la fenêtre X par défaut, elle dispose d'un environnement de fenêtrage natif.


3 commentaires

Sur un serveur X moderne, le Randr extension fournira de meilleures informations.


Fyi Réponse pour Windows


FYI: avec x11, le matériel DPI du matériel peut souvent être calculé (surtout lorsqu'il existe plusieurs écrans avec x11 ..) - Lorsque vous écrivez une application, vous devez tenter d'honorer ce que l'utilisateur a demandé à la place - voir XFT.DPI.



2
votes

Vous pouvez utiliser nscreen pour obtenir les dimensions des affichés ci-joints en pixels, mais cela ne vous donnera pas la taille physique / ppi de l'écran et, en fait, je ne le fais pas Pensez qu'il y a des API qui seront capables de le faire de manière fiable.

Vous pouvez poser une fenêtre pour sa résolution, comme: xxx

Cela vous donnera actuellement un < Code> NSSIZE de {72,72} Pour tous les écrans, quelle que soit leur PPI actuel. La seule chose qui fait ce changement de valeur change le facteur de mise à l'échelle de l'utilitaire de débogage de quartz, ou si Apple active l'UI indépendante de la résolution. Vous pouvez obtenir le facteur d'échelle actuel en appelant: xxx

si vous devez vraiment connaître la résolution exacte (et je serais intéressé de savoir pourquoi vous pensez faire), vous pourrait créer une routine d'étalonnage de l'écran et faire mesurer l'utilisateur une ligne à l'écran avec une règle physique réelle. Brut, oui, mais cela fonctionnera.


1 commentaires

C'est parce que répondre à la question n'est pas possible, ce qui est ce que ma réponse dit. Vous ne pouvez pas obtenir une mesure physiquement précise de l'affichage à l'aide du logiciel seul. Je ne pense pas que ma réponse mérite A -1.



4
votes

J'ai cobillé ceci ensemble de xdpyinfo ... Compiler avec: 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);
}


1 commentaires

J'ai collé cela dans un fichier et j'ai essayé de compiler ceci dans OS X, mais cela me donne quelques erreurs: hastebin.com /ocikivubed.pas . Des conseils?



8
votes

sur un Mac, utilisez CGDisplaycreensize pour obtenir la taille de l'écran en millimètres.


0 commentaires

1
votes

Voici un moyen indépendant de la plate-forme d'obtenir l'écran DPI:

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

}


0 commentaires