2009-01-23 11 views
7

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).Converti pixel in pollici e viceversa in C#

C'è un modo?

+0

DPI di cosa? schermo? stampante? ...? –

risposta

7

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

Supponendo che sia ancora necessaria una risposta, indipendentemente dall'accuratezza, e non si dispone di un oggetto grafico, è possibile crearne uno dallo schermo con alcuni 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); 
+0

In base a ciò che l'utente stava chiedendo, questa dovrebbe essere la risposta accettata. – epotter

6

C'è, fisicamente, nessun modo reale senza conoscere il DPI. I pixel sono discreti, i pollici non lo sono, se stai parlando di pollici sul tuo monitor, devi conoscere (almeno la risoluzione (e le proporzioni pixel) e le dimensioni dell'area del monitor visibile per calcolare il tuo DPI . La risoluzione di solito è possibile recuperare da qualche parte (io non sono un programmatore C# o .NET, quindi non posso aiutarti), ma la dimensione del monitor di solito non è disponibile. Se la stima è abbastanza buono poi all'utente di inserire la dimensione del monitor (vale a dire 21" o qualsiasi altra cosa) e risolvere per il DPI:

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

dare (a patto di saper 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 qualsiasi altra cosa) e le proporzioni pixel non sono quasi mai esattamente 1: 1.

Se si parla di pollici su carta, quindi, in modo del tutto naturale, è necessario conoscere il DPI della stampante (o, più precisamente, le impostazioni correnti della stampante).

+0

Quindi, dato che non ho accesso all'oggetto Graphics, come faccio a calcolare il DPI? – AngryHacker

+0

Risolvere l'equazione per DPI, assumendo che il resto sia noto. – falstro

+0

Come faccio a sapere la lunghezza diagonale del monitor? La mia app verrà eseguita su computer che non controllo. – AngryHacker

1

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

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

+0

Non posso. Sto scrivendo il codice in un file code-behind di un foglio di report di ActiveReports. Non ha queste proprietà. – AngryHacker

+0

Ha dichiarato di utilizzare WPF, che non è WinForms. Usare i due insieme può causare seri mal di testa. – mmr

+0

@mmr: No, non ha dichiarato che sta usando WPF. In effetti, il riferimento a 'Graphic' sembra implicare fortemente WinForms. Grazie per il down-vote, comunque. – Noldorin