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. P>
Merci d'avance! P>
5 Réponses :
in x sur Linux, appelez 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. P> xopendisplay () code> pour obtenir le
affichage code>, puis utiliser
displaywidthmm () code> et
displayheighmm () code> avec
displaywidth () code> et
displayheight () code> pour calculer le dpi. p>
Sur un serveur X moderne, le Randr extension fournira de meilleures informations.
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.
Vous pouvez utiliser Vous pouvez poser une fenêtre pour sa résolution, comme: p> Cela vous donnera actuellement un < Code> NSSIZE CODE> de 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. P> p> nscreen code> 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.
{72,72} code> 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: p>
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.
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); }
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?
sur un Mac, utilisez CGDisplaycreensize pour obtenir la taille de l'écran en millimètres. P>
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); } }
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.