Question

Je cherche à convertir les pixels en pouces et inversement. Je comprends que j'ai besoin de DPI, mais je ne sais pas comment obtenir ces informations (par exemple, je n'ai pas l'objet Graphics , ce n'est donc pas une option).

Y a-t-il un moyen?

Était-ce utile?

La solution

Sur un périphérique vidéo, toute réponse à cette question est généralement peu précise. L'exemple le plus simple à utiliser pour comprendre pourquoi tel est le cas est un projecteur. La résolution de sortie est, par exemple, 1024x768, mais le DPI varie en fonction de la distance entre l’écran et l’ouverture du projecteur. WPF, par exemple, suppose toujours 96 DPI sur un périphérique vidéo.

En supposant que vous ayez toujours besoin d'une réponse, quelle que soit l'exactitude, et que vous ne possédez pas d'objet Graphics, vous pouvez en créer une à partir de l'écran avec un P / Invoke et en obtenir la réponse.

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

Autres conseils

Il n’existe physiquement aucun moyen réel de connaître le DPI. Les pixels sont discrets, pas les pouces, si vous parlez pouces sur votre moniteur, vous devez connaître (au moins) la résolution (et le rapport de format des pixels) ainsi que la taille de la zone du moniteur visible afin de calculer votre DPI . Il est généralement possible de chercher la résolution quelque part (je ne suis pas un programmeur C # ou .NET, je ne peux donc pas vous aider), mais la taille du moniteur n’est généralement pas disponible. Si l’estimation est suffisante, demandez à l’utilisateur de saisir la taille de l’écran (par exemple, 21 "ou autre) et de résoudre le problème en DPI:

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

donner (en supposant que vous connaissiez 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 format de pixel est rarement de 1: 1.

Si vous parlez petit sur un papier, vous devez bien entendu connaître le DPI de votre imprimante (ou, plus précisément, les paramètres actuels de l'imprimante).

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 semblez savoir. N'oubliez pas de disposer de l'objet graphique après l'avoir créé (idéalement avec une instruction Using).

Si vous n'utilisez pas WinForms, veuillez nous indiquer de quel type d'application il s'agit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top