Domanda

Sto cercando di convertire i pixel in pollici e viceversa. Capisco che ho bisogno di DPI, ma non sono sicuro di come ottenere queste informazioni (ad esempio non ho l'oggetto Graphics , quindi non è un'opzione).

C'è un modo?

È stato utile?

Soluzione

Su un dispositivo video, qualsiasi risposta a questa domanda non è in genere molto accurata. L'esempio più semplice da usare per vedere perché questo è il caso è un proiettore. Ad esempio, la risoluzione di uscita è 1024x768, ma il DPI varia in base alla distanza dello schermo dall'apparenza del proiettore. WPF, ad esempio, assume sempre 96 DPI su un dispositivo video.

Presumendo che tu abbia ancora bisogno di una risposta, indipendentemente dall'accuratezza, e non hai un oggetto Graphics, puoi crearne uno dallo schermo con un P / Invoke e ottenere la risposta da esso.

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);

Altri suggerimenti

Non c'è, fisicamente, nessun modo reale senza conoscere il DPI. I pixel sono discreti, i pollici no, se si parla in pollici sul monitor, è necessario conoscere (almeno) la risoluzione (e le proporzioni dei pixel) e le dimensioni dell'area del monitor visibile per calcolare il DPI . Di solito è possibile recuperare la risoluzione da qualche parte (non sono un programmatore C # o .NET, quindi non posso aiutarti lì), ma le dimensioni del monitor non sono di solito disponibili. Se un preventivo è abbastanza buono, chiedi all'utente di inserire le dimensioni del monitor (ovvero 21 "o altro) e risolvere per DPI:

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

dare (supponendo che tu conosca la diagonale e la risoluzione)

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

Questa è solo una stima, poiché i monitor non sono mai esattamente 21 " (.. o altro) e le proporzioni pixel non sono quasi mai esattamente 1: 1.

Se parli di pollici su carta, allora, naturalmente, devi conoscere il DPI della tua stampante (o, più precisamente, le impostazioni correnti della stampante).

È possibile creare l'oggetto Graphics semplicemente chiamando this.CreateGraphics () (o più in generale Control.CreateGraphics () ) e quindi utilizzare le proprietà DpiX e DpiY come sembra che tu sappia. Ricorda di eliminare l'oggetto grafico dopo averlo creato (idealmente con un'istruzione Using).

Se non si utilizza WinForms, fateci sapere che tipo di applicazione è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top