2009-01-23 11 views
7

Je cherche à convertir les pixes en pouces et vice versa. Je comprends que j'ai besoin de DPI, mais je ne suis pas sûr de savoir comment obtenir cette information (par exemple, je n'ai pas l'objet Graphics, donc ce n'est pas une option).Convertir les pixels en pouces et vice versa en C#

Y a-t-il un moyen?

+0

DPI de quoi? écran? imprimante? ...? –

Répondre

7

Sur un périphérique vidéo, toute réponse à cette question n'est généralement pas très précise. L'exemple le plus simple à utiliser pour voir pourquoi c'est le cas est un projecteur. La résolution de sortie est, disons, 1024x768, mais le DPI varie en fonction de la distance de l'écran de l'aperture du projecteur. WPF, par exemple, suppose toujours 96 DPI sur un appareil vidéo. En supposant que vous ayez toujours besoin d'une réponse, quelle que soit la précision, et que vous n'ayez pas d'objet Graphics, vous pouvez en créer un à partir de l'écran avec P/Invoke et obtenir la réponse correspondante.

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

Basé sur ce que l'utilisateur demandait, cela devrait être la réponse acceptée. – epotter

6

Il n'y a, physiquement, aucun moyen réel sans connaître le DPI. Les pixels sont discrets, les pouces ne le sont pas, si vous parlez pouces sur votre moniteur, vous devez connaître (au minimum) la résolution (et le format des pixels) et la taille de la zone du moniteur visible afin de calculer votre DPI . La résolution est généralement possible de chercher quelque part (je ne suis pas un programmeur C# ou .NET, donc je ne peux pas vous aider là-bas), mais la taille du moniteur n'est généralement pas disponible. Si une estimation est assez bon alors l'utilisateur à saisir la taille du moniteur (21" ou autre) et à résoudre pour DPI:

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

donnant (en supposant que vous connaissez la diagonale et la résolution)

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

Ceci est juste une estimation, car les moniteurs ne sont jamais exactement 21 "(.. ou quoi que ce soit), et le rapport d'aspect des pixels est rarement exactement 1: 1. Si vous parlez pouces sur papier, alors, tout naturellement, vous devez connaître le DPI de votre imprimante (ou, plus précisément, les paramètres actuels de l'imprimante).

+0

Donc, étant donné que je n'ai pas accès à l'objet Graphics, comment puis-je calculer le DPI? – AngryHacker

+0

Résous l'équation pour DPI, en supposant que le reste soit connu. – falstro

+0

Comment est-ce que je connaîtrais la longueur diagonale du moniteur? Mon application fonctionne sur des ordinateurs que je ne contrôle pas. – AngryHacker

1

Vous pouvez créer l'objet Graphics simplement en appelant this.CreateGraphics() (ou plus généralement Control.CreateGraphics()), puis utilisez les propriétés DpiX et DpiY comme vous le savez. N'oubliez pas de disposer l'objet graphique après l'avoir créé (idéalement avec une instruction Using).

Si vous n'utilisez pas WinForms, veuillez nous indiquer le type d'application.

+0

Je ne peux pas. J'écris du code dans un fichier code-behind d'une feuille de rapport ActiveReports. Il n'a pas ces propriétés. – AngryHacker

+0

Il a déclaré qu'il utilisait WPF, ce qui n'est pas WinForms. Utiliser les deux ensemble peut causer de sérieux maux de tête. – mmr

+0

@mmr: Non, il n'a pas déclaré qu'il utilise WPF. En fait, la référence à 'Graphic' semble impliquer fortement WinForms. Merci pour le vote négatif, de toute façon. – Noldorin