2009-01-23 11 views
7

Ich bin auf der Suche nach Pixeln in Zoll konvertieren und umgekehrt. Ich verstehe, dass ich DPI benötige, aber ich bin nicht sicher, wie man diese Information erhält (z. B. habe ich nicht das Graphics Objekt, also ist das keine Option).Konvertieren von Pixeln zu Zoll und umgekehrt in C#

Gibt es einen Weg?

+0

DPI von was? Bildschirm? Drucker? ...? –

Antwort

7

Auf einem Videogerät ist eine Antwort auf diese Frage normalerweise nicht sehr genau. Das einfachste Beispiel dafür, warum dies der Fall ist, ist ein Projektor. Die Ausgabeauflösung beträgt beispielsweise 1024 x 768, aber die DPI variiert je nachdem, wie weit der Bildschirm vom Projektor entfernt ist. WPF nimmt zum Beispiel immer 96 DPI auf einem Videogerät an.

Vorausgesetzt, Sie benötigen immer noch eine Antwort, unabhängig von der Genauigkeit, und Sie haben kein Graphics-Objekt, können Sie eine mit einigen P/Invoke erstellen und die Antwort 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); 
+0

Basierend auf dem, wonach der Benutzer gefragt hat, sollte dies die akzeptierte Antwort sein. – epotter

6

Es gibt, physikalisch, keinen wirklichen Weg, ohne die DPI zu kennen. Pixel sind diskret, Zoll nicht, wenn Sie in Zoll auf Ihrem Monitor sprechen, müssen Sie (mindestens) die Auflösung (und Pixel-Seitenverhältnis) und die Größe des sichtbaren Monitorbereichs kennen, um Ihre DPI zu berechnen . Die Auflösung ist normalerweise möglich, irgendwo zu holen (ich bin kein C# oder .NET Programmierer, also kann ich Ihnen dort nicht helfen), aber die Größe des Monitors ist normalerweise nicht verfügbar. Wenn eine Schätzung gut genug ist, dann hat der Benutzer die Größe des Monitors eingeben (zB 21" oder was auch immer) und lösen für DPI:

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

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

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

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

Wenn Sie Zoll auf Papier sprechen, müssen Sie natürlich die DPI Ihres Druckers (genauer gesagt, die aktuellen Druckereinstellungen) kennen.

+0

Also, da ich keinen Zugriff auf das Graphics-Objekt habe, wie berechne ich die DPI? – AngryHacker

+0

Lösen Sie die Gleichung für DPI, vorausgesetzt, der Rest ist bekannt. – falstro

+0

Wie würde ich die diagonale Länge des Monitors kennen? Meine App wird auf Computern ausgeführt, die ich nicht kontrolliere. – AngryHacker

1

Sie können das Graphics-Objekt erstellen, indem Sie einfach this.CreateGraphics() (oder allgemeiner Control.CreateGraphics()) aufrufen und dann die DpiX- und DpiY-Eigenschaften verwenden, wie Sie zu wissen scheinen. Denken Sie daran, das Grafikobjekt nach dem Erstellen zu entfernen (idealerweise mit einer Using-Anweisung).

Wenn Sie keine WinForms verwenden, teilen Sie uns bitte mit, welche Art von Anwendung es ist.

+0

kann ich nicht. Ich schreibe Code in eine Code-Behind-Datei eines ActiveReports-Berichtsblattes. Es hat diese Eigenschaften nicht. – AngryHacker

+0

Er hat angegeben, dass er WPF verwendet, was nicht WinForms ist. Die Verwendung der beiden zusammen kann ernsthafte Kopfschmerzen verursachen. – mmr

+0

@mmr: Nein, er hat nicht angegeben, dass er WPF benutzt. In der Tat scheint der Verweis auf die Grafik WinForms stark zu implizieren. Danke für die Abstimmung. – Noldorin