c# - una - programa para convertir metros a centimetros
Convierte píxeles a pulgadas y viceversa en C# (3)
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 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 para 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 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 conocer el DPI de su impresora (o, más exactamente, la configuración actual de la impresora).
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?
Puede crear el objeto Graphics simplemente llamando 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, háganos saber qué tipo de aplicación es.
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 todavía 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);