¿Cómo determino el tamaño de píxel verdadero de mi monitor en .NET?

Quiero mostrar una imagen con ‘tamaño real’ en mi aplicación. Para eso necesito saber el tamaño de píxel de la pantalla.

Sé que la resolución de la pantalla de Windows es nominalmente de 96 ppp, pero para mi propósito quiero una mejor suposición. Entiendo que esta información puede no estar siempre disponible o ser precisa (por ejemplo, pantallas CRT antiguas), pero imagino que con la presencia de pantallas LCD esto debería ser posible.

¿Hay alguna manera de obtener el tamaño de píxel de mi pantalla?

¿Hay alguna manera de determinar si el tamaño del píxel es exacto?

Se prefiere la API .NET (no pude encontrarlos), pero Win32 también está bien, me complace P / Invoke.

Para el tamaño de visualización, querrá Screen .PrimaryScreen.Bounds.Size (o Screen.GetBounds(myform) ).

Si quiere el DPI, use las propiedades DpiX y DpiY de Graphics :

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

¡Oh espera! ¿Querías real, sostener una regla hasta el monitor y medir, tamaño? No. No es posible usar ningún servicio del sistema operativo. El sistema operativo no conoce las dimensiones reales del monitor ni cómo lo calibró el usuario. Parte de esta información es teóricamente detectable, pero no es lo suficientemente determinista para que el sistema operativo la use de manera confiable, por lo que no es así.

Como alternativa, puedes probar un par de cosas.

  • Puede tratar de consultar la cadena de visualización del dispositivo de monitor instalado (no estoy seguro de cómo hacerlo) y ver si puede analizar un tamaño razonable de eso. Por ejemplo, el monitor podría ser un “ValueBin E17p”, y podría deducir que se trata de un monitor de 17 “. Por supuesto, esta cadena de pantalla probablemente sea” Plug and Play Monitor “. Este esquema es bastante incompleto en el mejor de los casos. .
  • Podría preguntarle al usuario qué tamaño de monitor tienen. Quizás ellos lo sepan.

Una vez que sepa (o crea que sabe) el tamaño diagonal del monitor, debe encontrar su relación de aspecto físico. Nuevamente, un par de cosas:

  • Suponga que la relación de aspecto de píxeles actual coincide con la relación de aspecto físico del monitor. Esto supone que (A) el usuario ha elegido una resolución que es ideal para su monitor, y que (B) el monitor tiene píxeles cuadrados. No sé de un monitor de computadora actual orientado al consumidor que no tenga píxeles cuadrados, pero sí lo hicieron los más antiguos y los más nuevos sí.
  • Preguntar al usuario Quizás ellos lo sepan.

Una vez que sepa (o crea que sabe) cuál es el tamaño diagonal del monitor y la relación de aspecto físico, entonces puede calcular su ancho y altura físicos. A 2 + B 2 = C 2 , por lo que algunos cálculos te lo darán bien:

Si descubrió que es un monitor de 17 “, y su resolución actual es 1280 x 1024:
1280 2 + 1024 2 = 2686976
Sqrt (2686976) = 1639.1998047828092637409837247032
17 “* 1280 / 1639.2 = 13.274768179599804782820888238165”
17 “* 1024 / 1639.2 = 10.619814543679843826256710590532”

Esto pone el ancho físico a 13.27 “y la altura física a 10.62”. Esto hace que los píxeles 13.27 “/ 1280 = 10.62” / 1024 = 0.01037 “o aproximadamente 0.263 mm.

Por supuesto, todo esto no es válido si el usuario no tiene una resolución adecuada, el monitor tiene extraños píxeles no cuadrados, o es un monitor analógico antiguo y los controles no están ajustados correctamente para que la pantalla llene todo el espacio físico. pantalla. O peor, podría ser un proyector.

Al final, es mejor realizar un paso de calibración en el que el usuario realmente tenga una regla en la pantalla y medir el tamaño de algo para usted. Tú podrías:

  • Haga que el usuario haga clic en el mouse en dos puntos separados por una pulgada (o un centímetro).
  • Dibuja un cuadro en la pantalla y haz que el usuario presione las flechas hacia arriba y hacia abajo para ajustar su altura, y las flechas hacia la izquierda y hacia la derecha para ajustar su ancho, hasta que el cuadro tenga exactamente una pulgada (o centímetro) de acuerdo con su regla.
  • Dibuja un cuadro en la pantalla y haz que el usuario te diga cuántas pulgadas / centímetros hay en cada dimensión.

No importa lo que haga , no espere que sus resultados sean 100% precisos. Hay demasiados factores en juego para que usted (o el usuario) consiga que esto sea exactamente correcto, todo el tiempo.

Tenga en cuenta que 96 ppp generalmente es bastante cercano a la precisión. Los píxeles modernos en pantallas no proyectadas tienden a ser de aproximadamente 0,25 mm, más o menos, por lo que generalmente se obtienen unos 100 píxeles físicos por pulgada, más o menos, si el monitor se establece en su resolución original. (Por supuesto, esta es una gran generalización y no se aplica a todos los monitores. Las PC Eee, por ejemplo, tienen píxeles de aproximadamente 0,19 mm, si recuerdo las especificaciones correctamente).

lo siento, tienes que P / invocar para obtener esta información.

Aquí está el enlace que utilicé hace un tiempo: http://www.davidthielen.info/programming/2007/05/get_screen_dpi_.html

Puede verificar simplemente calculando manualmente desde su tamaño de pantalla

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

Eso le daría el ancho de píxel en pulgadas

GetDeviceCaps puede ser P / invocado para obtener algunas cifras, pero nunca he sabido que las cifras sean tan confiables …

Puede obtener las dimensiones físicas de la pantalla con la información EDID almacenada en el registro. Puede obtener la clave de registro del monitor apropiado utilizando la llamada de la API de Windows EnumDisplayDevices.

Dimensiones físicas al objeto Pantalla :