2009-01-23 20 views
7

Estoy buscando convertir píxeles en pulgadas y viceversa. Entiendo que necesito DPI, pero no estoy seguro de cómo obtener esta información (por ejemplo, no tengo el objeto Graphics, así que no es una opción).Convertir píxeles a pulgadas y viceversa en C#

¿Hay alguna manera?

+0

DPI de qué? ¿pantalla? ¿impresora? ...? –

Respuesta

7

En un dispositivo de video, cualquier respuesta a esta pregunta generalmente no es muy precisa. El ejemplo más fácil de usar para ver por qué este es el caso es un proyector. La resolución de salida es, por ejemplo, 1024x768, pero el DPI varía según qué tan lejos esté la pantalla del apeture del proyector. WPF, por ejemplo, siempre asume 96 DPI en un dispositivo de video.

Suponiendo que aún necesita una respuesta, independientemente de la precisión, y no tiene un objeto Graphics, puede crear uno desde la pantalla con un poco de P/Invoke y obtener la respuesta.

Single xDpi, yDpi; 

IntPtr dc = GetDC(IntPtr.Zero); 

using(Graphics g = Graphics.FromHdc(dc)) 
{ 
    xDpi = g.DpiX; 
    yDpi = g.DpiY; 
} 

if (ReleaseDC(IntPtr.Zero) != 0) 
{ 
    // GetLastError and handle... 
} 


[DllImport("user32.dll")] 
private static extern IntPtr GetDC(IntPtr hwnd);  
[DllImport("user32.dll")] 
private static extern Int32 ReleaseDC(IntPtr hwnd); 
+0

Según lo que el usuario estaba pidiendo, esta debería ser la respuesta aceptada. – epotter

6

físicamente, no hay forma real sin conocer el DPI. Los píxeles son discretos, las pulgadas no, si habla pulgadas en su monitor, necesita saber (al menos) la resolución (y la relación de aspecto de píxeles) y el tamaño del área del monitor visible para calcular su DPI . La resolución generalmente es posible buscarla en algún sitio (no soy programador de C# o .NET, así que no puedo ayudarlo), pero el tamaño del monitor no suele estar disponible. Si la estimación es lo suficientemente bueno entonces que el usuario introduzca el tamaño de la pantalla (es decir, 21" o lo que sea) y resolver para los DPI:

(resX/DPI)^2 + (resY/DPI)^2 = screenDiagonal^2 

dando (suponiendo que conoce la diagonal y la resolución)

DPI = sqrt(resX^2+resY^2)/screenDiagonal 

Esto es sólo una estimación, ya que los monitores nunca son exactamente 21 "(.. o lo que sea), y la relación de aspecto de píxeles casi nunca es exactamente 1: 1.

Si habla pulgadas en papel, entonces, naturalmente, necesita saber el DPI de su impresora (o, más exactamente, la configuración actual de la impresora).

+0

Entonces, dado que no tengo acceso al objeto Graphics, ¿cómo calculo el DPI? – AngryHacker

+0

Resuelve la ecuación para DPI, suponiendo que se conozca el resto. – falstro

+0

¿Cómo sabría la longitud diagonal del monitor? Mi aplicación se ejecutará en computadoras que no controlo. – AngryHacker

1

Puede crear el objeto Graphics simplemente llamando al this.CreateGraphics() (o más generalmente Control.CreateGraphics()) y luego use las propiedades DpiX y DpiY como parece saber. Solo recuerda desechar el objeto gráfico después de haberlo creado (idealmente con una instrucción Using).

Si no está utilizando WinForms, indíquenos qué tipo de aplicación es.

+0

No puedo. Estoy escribiendo código en un archivo de código subyacente de una hoja de informe ActiveReports. No tiene estas propiedades. – AngryHacker

+0

Él dijo que está usando WPF, que no es WinForms. Usar los dos juntos puede causar dolores de cabeza serios. – mmr

+0

@mmr: No, él no declaró que está usando WPF. De hecho, la referencia al 'Gráfico' parece implicar fuertemente a WinForms. Gracias por el voto negativo, de todos modos. – Noldorin

Cuestiones relacionadas