Pregunta

Estoy buscando convertir pixeles a 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 , por lo que no es una opción).

¿Hay alguna manera?

¿Fue útil?

Solución

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 de la abertura del proyector. WPF, por ejemplo, siempre asume 96 DPI en un dispositivo de video.

Suponiendo que todavía necesita una respuesta, independientemente de la precisión, y que 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);

Otros consejos

Hay, 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 (como mínimo) la resolución (y la relación de aspecto de píxeles) y el tamaño del área visible del monitor para calcular su DPI . La resolución generalmente es posible obtenerla en algún lugar (no soy un programador de C # o .NET, por lo que no puedo ayudarlo allí), pero el tamaño del monitor generalmente no está disponible. Si una estimación es lo suficientemente buena, haga que el usuario ingrese el tamaño del monitor (es decir, 21 '' o lo que sea) y resuelva el DPI:

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

dar (suponiendo que conozca la diagonal y la resolución)

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

Esto es solo 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 conocer el DPI de su impresora (o, más exactamente, la configuración actual de la impresora).

Puede crear el objeto Graphics simplemente llamando a this.CreateGraphics () (o más generalmente Control.CreateGraphics () ) y luego use las propiedades DpiX y DpiY como Pareces saberlo. Solo recuerde deshacerse del objeto gráfico después de crearlo (idealmente con una instrucción Using).

Si no está utilizando WinForms, háganos saber qué tipo de aplicación es.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top