2009-01-07 7 views
7

Quiero mostrar una imagen en 'tamaño real' en mi aplicación. Para eso necesito saber el tamaño de píxel de la pantalla.¿Cómo determino el tamaño de píxel verdadero de mi monitor en .NET?

Sé que la resolución de la pantalla de Windows es nominalmente de 96dpi, 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?

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

Respuesta

24

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

Si desea que el ppp, utilice la DpiX y DpiY propiedades 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 cualquiera servicios 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 solución alternativa, puede intentar un par de cosas.

  • Puede intentar 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 usted podría deducir que es un monitor de 17 ". Por supuesto, esta cadena de pantalla es probable que sea" Plug and Play Monitor ". Este esquema es bastante incompleto en el mejor.
  • se podría pedir el usuario lo monitor de tamaño que tienen. Tal sabrán.

Una vez que sepa (o pensar sabes) tamaño de la diagonal del monitor, necesita 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í.
  • Pregunta al usuario. Tal vez lo sabrán.

Una vez que sabe (o cree sabes) lo que el tamaño diagonal de la pantalla y relación de aspecto físico son, entonces se puede calcular la anchura y la altura física. Un + B = C , por lo que algunos cálculos le dará a usted bien:

Si has descubierto que es un monitor de 17" , y su resolución actual es 1280 x 1024:
+ 1024 = 2686976
Sqrt (2686976) = 1639,1998047828092637409837247032
17" * 1280/1639,2 = 13,274768179599804782820888238165"
17" * 10 24/1639.2 = 10.619814543679843826256710590532 "

Esto pone el ancho físico en 13.27" y la altura física en 10.62 ". Esto hace que los píxeles 13.27 "/ 1280 = 10.62"/1024 = 0.01037 "o alrededor de 0.263 mm.

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

Al final, es posible que no funcione una etapa de calibración donde se tiene el usuario realidad mantener una regla hasta la pantalla, y medir el tamaño de algo para usted, usted podría:.

  • Haga que el usuario haga clic con 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 derecha para ajustar su ancho, hasta que el cuadro tenga exactamente una pulgada (o regla.
  • Dibuje un cuadro en la pantalla y haga que el usuario le diga cuántas pulgadas/centímetros hay en cada dimensión.

No importa lo que haces, no esperan que sus resultados sean 100% exacto. 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 es generalmente bastante cerca de para precisar. Los píxeles modernos en las pantallas no proyectadas tienden a ser de aproximadamente 0,25 mm, más o menos, por lo que generalmente termina con aproximadamente 100 píxeles físicos por pulgada, más o menos, si el monitor está configurado en su resolución original.(Por supuesto, esta es una gran generalización y no se aplica a todos los monitores. Eee PC, por ejemplo, tiene píxeles de aproximadamente 0,19 mm de tamaño, si recuerdo las especificaciones correctamente.)

1

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

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

+1

Esto parece que sólo se pone lo ventanas tiene el dpi a establecer, que generalmente será 96 ppp independientemente del tamaño de pantalla y resolución. –

+2

Esto es lo que devolverá la instancia de Graphics (ver la respuesta de P Daddy). Sin necesidad de P/Invoke. –

1

Usted puede comprobar con sólo el cálculo de forma manual desde el tamaño de la pantalla

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

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

+0

Creo que la pregunta es cómo obtener programáticamente LCD_SCREEN_DIAGONAL_IN_INCHES –

+0

por lo tanto, la palabra "verificar", que estaba pidiendo una forma de comprobar después de obtener el dpi – Pyrolistical

1

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

0

Puede obtener el físico dimensiones de la pantalla usando 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.

Physical Dimensions to the Screen object:

+0

El enlace está ahora muerto. – DuckMaestro

Cuestiones relacionadas