2010-04-12 23 views
9

Tôi cần biết DPI màn hình đang hoạt động trên Linux và Mac OS. Tôi nghĩ rằng trên linux xlib có thể hữu ích, nhưng tôi không thể tìm thấy một cách làm thế nào để có được DPI dòng. Tôi muốn thông tin này có kích thước màn hình thực bằng inch.Làm thế nào để có được màn hình DPI (linux, mac) theo chương trình?

Cảm ơn trước!

+4

Hãy cẩn thận với điều này. Thông tin về DPI nói chung không đáng tin cậy. Trình điều khiển có thể làm cho nó sai và theo dõi thông tin EDID có thể nói dối, đôi khi rất thô lỗ. Đảm bảo có ghi đè. – bobince

Trả lời

6

Trong X trên Linux, gọi XOpenDisplay() để có được những Display, sau đó sử dụng DisplayWidthMM()DisplayHeightMM() cùng với DisplayWidth()DisplayHeight() để tính DPI.

Trên máy Mac, có gần như chắc chắn một API bản địa để sử dụng hơn X. Mac OS X không chạy X Window theo mặc định, nó có môi trường cửa sổ gốc.

+0

[Trả lời cho Mac] (http://stackoverflow.com/a/12589799/14558). – andrewdotn

+0

Trên máy chủ X hiện đại, tiện ích mở rộng [RandR] (http://www.x.org/wiki/Projects/XRandR/) sẽ cung cấp thông tin tốt hơn. – elmindreda

+0

FYI [Trả lời cho Windows] (http://stackoverflow.com/questions/577736/how-to-obtain-the-correct-physical-size-of-the-monitor) –

2

Bạn có thể sử dụng NSScreen để nhận kích thước của (các) hiển thị được đính kèm theo pixel, nhưng điều này sẽ không cung cấp cho bạn kích thước vật lý/PPI của màn hình và thực tế tôi không nghĩ rằng có bất kỳ API nào sẽ có thể thực hiện điều này một cách đáng tin cậy.

Bạn có thể yêu cầu một cửa sổ cho độ phân giải của nó như sau:

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

này sẽ hiện cung cấp cho bạn một NSSize của {72,72} cho tất cả màn hình, không có vấn đề gì PPI thực tế của họ. Điều duy nhất làm thay đổi giá trị này là thay đổi hệ số nhân rộng trong tiện ích Quartz Debug, hoặc nếu Apple từng bật giao diện người dùng độc lập với độ phân giải. Bạn có thể lấy các yếu tố quy mô hiện tại bằng cách gọi:

[[NSScreen mainScreen] userSpaceScaleFactor]; 

Nếu bạn thực sự phải biết độ phân giải chính xác (và tôi muốn được quan tâm để biết lý do tại sao bạn nghĩ rằng bạn làm), bạn có thể tạo ra một thói quen màn hình hiệu chuẩn và có người dùng đo một dòng trên màn hình với một người cai trị vật lý thực tế. Thô, vâng, nhưng nó sẽ hoạt động.

+0

-1 Trả lời không trả lời câu hỏi. – MaxVT

+0

Đó là bởi vì trả lời câu hỏi là không thể, đó là những gì câu trả lời của tôi nói. Bạn KHÔNG THỂ có được đo lường chính xác về mặt vật lý của màn hình bằng phần mềm. Tôi không nghĩ câu trả lời của tôi xứng đáng là ‑1. –

4

tôi rải sỏi này với nhau từ xdpyinfo ... Compile với: 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

Tôi dán nó vào một tập tin và cố gắng biên dịch nó trong OS X, nhưng nó cho tôi một vài lỗi: http://hastebin.com/ocikivubed.pas. Có lời khuyên nào không? – trusktr

7

Trên một mac, sử dụng CGDisplayScreenSize để có được kích thước màn hình bằng mm.

1

Đây là một cách nền tảng độc lập để có được những DPI màn hình:

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

} 

Bạn có thể tải về một jar biên soạn những điều này từ here. Sau khi tải xuống, java -jar dpi.jar sẽ hiển thị cho bạn DPI.

Các vấn đề liên quan