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.
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:
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:
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 :