2009-01-07 26 views
7

Tôi muốn hiển thị hình ảnh ở 'kích thước thật' trong ứng dụng của tôi. Tôi cần biết kích thước pixel của màn hình.Làm cách nào để xác định kích thước pixel thực của Màn hình của tôi trong .NET?

Tôi biết độ phân giải màn hình của Windows là 96dpi, nhưng với mục đích của tôi, tôi muốn đoán rõ hơn. Tôi hiểu rằng thông tin này có thể không phải lúc nào cũng có sẵn hoặc chính xác (ví dụ: màn hình CRT cũ hơn), nhưng tôi tưởng tượng với sự ưu tiên của màn hình LCD rằng điều này có thể xảy ra!

Có cách nào để lấy kích thước pixel của màn hình của tôi không?

Có cách nào để xác định xem kích thước pixel có chính xác không?

Ưu tiên của API .NET (Tôi không thể tìm thấy chúng), nhưng Win32 cũng OK, tôi rất vui khi P/Gọi.

Trả lời

24

Đối với kích thước hiển thị, bạn sẽ muốn Screen.PrimaryScreen.Bounds.Size (hoặc Screen.GetBounds(myform)).

Nếu bạn muốn DPI, sử dụng DpiXDpiY thuộc tính của Graphics:

PointF dpi = PointF.Empty; 
using(Graphics g = this.CreateGraphics()){ 
    dpi.X = g.DpiX; 
    dpi.Y = g.DpiY; 
} 

Oh, chờ đợi! Bạn muốn thực tế, giữ một người cai trị lên đến màn hình và đo lường, kích thước ?! Không. Không thể sử dụng mọi dịch vụ OS. Hệ điều hành không biết kích thước thực tế của màn hình hoặc cách người dùng đã hiệu chỉnh nó. Một số thông tin này được phát hiện về mặt lý thuyết, nhưng nó không đủ quyết định để hệ điều hành sử dụng nó một cách đáng tin cậy, vì vậy nó không có.

Là một công việc xung quanh, bạn có thể thử một vài điều.

  • Bạn có thể thử truy vấn chuỗi hiển thị của thiết bị màn hình đã cài đặt (Tôi không chắc chắn cách thực hiện) và xem bạn có thể phân tích kích thước hợp lý không. Ví dụ, màn hình có thể là "ValueBin E17p" và bạn có thể suy đoán rằng đó là màn hình 17 "từ đó. Tất nhiên, chuỗi hiển thị này có thể là" Màn hình Plug and Play ". lúc tốt nhất.
  • bạn có thể hỏi người dùng những gì màn hình kích thước mà họ có. lẽ họ sẽ biết.

Một khi bạn biết (hoặc nghĩ bạn biết) kích thước đường chéo của màn hình, bạn cần phải tìm tỷ lệ khung hình vật lý của nó.Một lần nữa, một vài điều:

  • Giả sử tỷ lệ cỡ ảnh pixel hiện tại phù hợp với tỷ lệ khung hình vật lý của màn hình. Điều này giả định rằng (A) người dùng đã chọn độ phân giải lý tưởng cho màn hình của họ và (B) màn hình có pixel vuông. Tôi không biết một màn hình máy tính theo định hướng người tiêu dùng hiện tại không có pixel vuông, nhưng những cái cũ hơn và những cái mới hơn có thể.
  • Hỏi người dùng. Có thể họ sẽ biết.

Khi bạn biết (hoặc nghĩ bạn biết) kích thước đường chéo và tỉ lệ khung hình của màn hình là gì, bạn có thể tính chiều rộng và chiều cao vật lý của màn hình. Một + B = C , do đó, một vài tính toán sẽ đưa nó cho bạn tốt:

Nếu bạn phát hiện ra rằng đó là một 17" màn hình, và độ phân giải hiện tại của nó là 1280 x 1024:
+ 1024 = 2686976
Sqrt (2686976) = 1639,1998047828092637409837247032
17" * 1280/1639,2 = 13,274768179599804782820888238165"
17" * 10 24/1639.2 = 10.619814543679843826256710590532 "

Điều này đặt chiều rộng vật lý là 13,27" và chiều cao vật lý là 10,62 ". Điều này làm cho các điểm ảnh 13,27 "/ 1280 = 10,62"/1024 = 0,01037 "hoặc khoảng 0,263 mm.

Tất nhiên điều này không hợp lệ nếu người dùng không có độ phân giải phù hợp, màn hình có tính chất không phù hợp pixel vuông, hoặc đó là một màn hình tương tự cũ và các điều khiển không được điều chỉnh thích hợp cho màn hình hiển thị để lấp đầy toàn bộ màn hình vật lý hoặc tệ hơn, nó có thể là một máy chiếu. một bước hiệu chỉnh nơi bạn có người dùng thực sự giữ một người cai trị lên đến màn hình và đo kích thước của một cái gì đó cho bạn.Bạn có thể:

  • Cho phép người dùng nhấp chuột vào bất kỳ hai điểm nào cách nhau một inch (hoặc một centimet).
  • Vẽ một hộp trên màn hình và yêu cầu người dùng nhấn mũi tên lên và xuống để điều chỉnh chiều cao và mũi tên trái và phải để điều chỉnh chiều rộng cho đến khi ô chính xác là một inch (hoặc centimet) theo cái thước.
  • Vẽ một hộp trên màn hình và yêu cầu người dùng cho bạn biết số lượng inch/cm trong mỗi thứ nguyên.

Bất kể bạn làm gì, đừng mong đợi kết quả của bạn chính xác 100%. Có quá nhiều yếu tố để chơi cho bạn (hoặc người dùng) để có được điều này chính xác, mọi lúc.

Lưu ý rằng 96 dpi thường là khá gần để chính xác. Pixel hiện đại trên màn hình không chiếu tất cả có xu hướng khoảng 0,25 mm, cung cấp hoặc lấy, vì vậy bạn thường kết thúc với khoảng 100 pixel vật lý trên mỗi inch, cho hoặc lấy, nếu màn hình được đặt ở độ phân giải gốc.(Tất nhiên, đây là một khái quát rất lớn và không không áp dụng cho tất cả các màn hình. Ví dụ: Eee PC có kích thước pixel khoảng 0,19 mm, nếu tôi nhớ chính xác thông số.)

1

xin lỗi, bạn đã có P/Gọi thông tin này.

Đây là liên kết mà tôi sử dụng cho nó một thời gian trước: http://www.davidthielen.info/programming/2007/05/get_screen_dpi_.html

+1

này có vẻ như nó chỉ được bất cứ điều gì các cửa sổ có dpi thiết lập để, mà nói chung sẽ được 96dpi bất kể kích thước màn hình và độ phân giải. –

+2

Đây là trường hợp của Graphics sẽ trả về (xem câu trả lời P Daddy). Không cần P/Invoke. –

1

Bạn có thể kiểm tra bằng cách chỉ tay tính từ kích thước màn hình của bạn

cos(45)*LCD_SCREEN_DIAGONAL_IN_INCHES/sqrt(HORZ_RES^2 + VERT_RES^2) 

Điều đó sẽ cung cấp cho bạn các pixel chiều rộng theo inch

+0

Tôi nghĩ câu hỏi là làm thế nào để lập trình LCD_SCREEN_DIAGONAL_IN_INCHES –

+0

do đó từ "kiểm tra", anh ta đã yêu cầu một cách để kiểm tra sau khi anh ta nhận được liên kết dpi – Pyrolistical

1

GetDeviceCaps có thể là P/Invoke'd để có được một số con số, nhưng tôi chưa bao giờ biết những con số đó đáng tin cậy ...

0

Bạn có thể nhận được vật lý kích thước của màn hình bằng cách sử dụng thông tin EDID được lưu trữ trong sổ đăng ký. Bạn có thể lấy khoá đăng ký của màn hình thích hợp bằng cách sử dụng cuộc gọi API cửa sổ EnumDisplayDevices.

Physical Dimensions to the Screen object:

+0

bây giờ đã chết. – DuckMaestro

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