Frage

Ich suche pixes in Zoll und umgekehrt zu konvertieren. Ich verstehe, dass ich DPI müssen, aber ich bin nicht sicher, wie diese Informationen zu erhalten (zum Beispiel ich nicht das Graphics Objekt habe, das ist also keine Option).

Gibt es eine Möglichkeit?

War es hilfreich?

Lösung

Auf einem Videogerät, eine Antwort auf diese Frage ist in der Regel nicht sehr genau. Das einfachste Beispiel zu verwenden, um zu sehen, warum dies der Fall ist, ein Projektor ist. Die Ausgabeauflösung wird, sagen, 1024x768, aber die DPI variiert je nach, wie weit weg ist der Bildschirm vom Projektor apeture. WPF, zum Beispiel nimmt immer 96 DPI auf einem Videogerät.

Vorausgesetzt, müssen Sie noch eine Antwort, unabhängig von der Genauigkeit, und Sie nicht ein Graphics-Objekt haben, können Sie mit einigem P / Invoke einer vom Bildschirm erstellen und die Antwort von ihm erhalten.

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

Andere Tipps

Es ist, physisch, keine wirkliche Möglichkeit, ohne die DPI zu kennen. Pixel sind diskret, Zoll sind nicht, wenn Sie Zoll auf Ihrem Bildschirm sprechen, müssen Sie (zumindest) kennen die Auflösung (und Pixel-Seitenverhältnis) und die Größe des sichtbaren Überwachungsbereich, um Ihre DPI zu berechnen . Die Auflösung ist in der Regel möglich, irgendwo zu holen (ich bin kein C # oder .NET-Programmierer, so kann ich Ihnen nicht helfen), aber die Größe des Monitors ist in der Regel nicht zur Verfügung. Wenn eine Schätzung gut genug ist, dann hat der Benutzer die Größe des Monitors eingeben (das heißt 21" oder was auch immer) und lösen für DPI:

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

geben (vorausgesetzt, Sie kennen die Diagonale und die Auflösung)

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

Das ist nur eine Schätzung, wie Monitore nie genau 21" (.. oder was auch immer) ist, und das Pixel-Seitenverhältnis ist so gut wie nie genau. 1: 1

Wenn Sie Zoll auf Papier reden, dann ganz natürlich müssen Sie die DPI des Druckers wissen (oder, genauer gesagt, die aktuellen Druckereinstellungen).

können Sie erstellen die Graphics-Objekt einfach durch this.CreateGraphics() Aufruf (oder mehr Control.CreateGraphics() im Allgemeinen) und dann die Eigenschaften DpiX und DpiY verwenden, wie Sie scheinen zu wissen. Denken Sie daran, entsorgen das Grafikobjekt nach dem Erstellen es (im Idealfall mit einer Using-Anweisung).

Wenn Sie nicht WinForms verwenden, dann lassen Sie es uns wissen, welche Art von Anwendung ist es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top