Wie ermittle ich die wahre Pixelgröße meines Monitors in .NET?

8

Ich möchte in meiner Anwendung ein Bild mit der tatsächlichen Größe anzeigen. Dazu muss ich die Pixelgröße des Displays kennen.

Ich weiß, Windows-Bildschirmauflösung ist nominal 96dpi, aber für meine Zwecke möchte ich eine bessere Schätzung. Ich verstehe, dass diese Information möglicherweise nicht immer verfügbar oder genau ist (z. B. ältere CRT-Anzeigen), aber ich stelle mir vor, dass dies mit der Prävalenz von LCD-Anzeigen möglich ist!

Gibt es eine Möglichkeit, die Pixelgröße meines Displays zu erhalten?

Gibt es eine Möglichkeit festzustellen, ob die Pixelgröße genau ist?

.NET API ist bevorzugt (ich konnte sie nicht finden), aber Win32 ist auch in Ordnung, ich freue mich auf P / Invoke.

    
Peter Tate 07.01.2009, 21:55
quelle

5 Antworten

24

Für die Anzeigegröße möchten Sie Screen .PrimaryScreen.Bounds.Size (oder Screen.GetBounds(myform) ).

Wenn Sie die DPI verwenden möchten, verwenden Sie DpiX und < a href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.dpiy.aspx"> DpiY Eigenschaften von Grafiken :

%Vor%

Oh, warte! Du wolltest wirklich, halte ein Lineal an den Monitor und maß, Größe ?! Nein. Nicht möglich mit any OS-Diensten. Das Betriebssystem kennt nicht die tatsächlichen Abmessungen des Monitors oder wie der Benutzer es kalibriert hat. Einige dieser Informationen sind theoretisch nachweisbar, aber sie sind nicht deterministisch genug, um vom Betriebssystem zuverlässig verwendet zu werden. Dies ist nicht der Fall.

Als Umgehung können Sie ein paar Dinge ausprobieren.

  • Sie können versuchen, die Anzeigezeichenfolge des installierten Monitorgeräts abzufragen (ich bin mir nicht sicher, wie das geht) und zu sehen, ob Sie daraus eine vernünftige Größe auslesen können. Beispielsweise könnte der Monitor ein "ValueBin E17p" sein, und Sie könnten daraus schließen, dass es sich um einen 17-Zoll-Monitor handelt. Natürlich ist diese Anzeigestring wahrscheinlich "Plug-and-Play-Monitor". Dieses Schema ist bestenfalls ziemlich skizzenhaft.
  • Sie könnten fragen den Benutzer, welche Größe Monitor sie haben. Vielleicht werden sie es wissen.

Sobald Sie die diagonale Größe des Monitors kennen (oder denken Sie wissen), müssen Sie sein physikalisches Seitenverhältnis finden. Noch ein paar Dinge:

  • Angenommen, das aktuelle Pixel-Seitenverhältnis entspricht dem physischen Seitenverhältnis des Monitors. Dies setzt voraus, dass (A) der Benutzer eine Auflösung gewählt hat, die für seinen Monitor ideal ist, und dass (B) der Monitor quadratische Pixel aufweist. Ich kenne keinen aktuellen Verbraucher-orientierten Computer-Monitor, der keine quadratischen Pixel hat, aber ältere und neuere könnten dies tun.
  • Fragen Sie den Benutzer. Vielleicht werden sie es wissen.

Sobald Sie wissen (oder denken Sie wissen), was die diagonale Größe und das physische Seitenverhältnis des Monitors sind, können Sie die physikalische Breite und Höhe berechnen. A 2 + B 2 = C 2 , also ein paar Berechnungen werden es Ihnen gut machen:

  

Wenn Sie herausgefunden haben, dass es sich um einen 17 "Monitor handelt und seine aktuelle Auflösung 1280 x 1024 ist:
  1280 2 + 1024 2 = 2686976
  Sqrt (2686976) = 1639.1998047828092637409837247032
  17 "* 1280 / 1639.2 = 13.274768179599804782820888238165"
  17 "* 1024 / 1639.2 = 10.619814543679843826256710590532"

Dies legt die physikalische Breite auf 13,27 "und die physikalische Höhe auf 10,62". Dies macht die Pixel 13,27 "/ 1280 = 10,62" / 1024 = 0,01037 "oder etwa 0,263 mm.

Natürlich ist all das ungültig, wenn der Benutzer keine geeignete Auflösung hat, der Monitor verrückte nicht-quadratische Pixel hat oder ein älterer analoger Monitor und die Steuerungen nicht richtig eingestellt sind, damit das Display ausfüllt der gesamte physische Bildschirm. Oder schlimmer noch, es könnte ein Projektor sein.

Am Ende sollten Sie einen Kalibrierungsschritt ausführen, bei dem der Benutzer ein Lineal bis zum Bildschirm halten und die Größe von etwas für Sie messen. Du könntest:

  • Lassen Sie den Benutzer mit der Maus zwei beliebige Zentimeter (oder Zentimeter) voneinander entfernt klicken.
  • Zeichnen Sie ein Feld auf dem Bildschirm und lassen Sie den Benutzer die Pfeile nach oben und nach unten drücken, um seine Höhe anzupassen, und die Pfeile nach links und rechts, um seine Breite anzupassen, bis die Box genau einen Zoll (oder Zentimeter) entspricht Lineal.
  • Zeichnen Sie ein Feld auf dem Bildschirm und lassen Sie den Benutzer sagen, wie viele Zoll / Zentimeter es in jeder Dimension ist.

Egal, was Sie tun , erwarten Sie nicht, dass Ihre Ergebnisse zu 100% genau sind. Es gibt viel zu viele Faktoren für Sie (oder den Benutzer), um dies jedes Mal genau zu korrigieren.

Beachten Sie, dass 96 dpi normalerweise ziemlich genau sind. Moderne Pixel auf nicht projizierten Bildschirmen sind in der Regel etwa 0,25 mm, geben oder nehmen, so dass Sie normalerweise mit über 100 physikalischen Pixeln pro Zoll enden, geben oder nehmen, wenn der Monitor auf seinen Bildschirm eingestellt ist native Auflösung. (Natürlich ist dies eine große Verallgemeinerung und gilt nicht für alle Monitore. Eee PCs haben zum Beispiel Pixel von etwa 0,19 mm Größe, wenn ich mich an die Spezifikationen richtig erinnere.)

    
P Daddy 07.01.2009, 23:06
quelle
1

Entschuldigung, Sie müssen P / Invoke für diese Information aufrufen.

Hier ist der Link, den ich vor einiger Zeit dafür benutzt habe: Ссылка

    
Stephen Wrighton 07.01.2009 22:01
quelle
1

Sie können überprüfen, indem Sie einfach manuell von Ihrer Bildschirmgröße berechnen

%Vor%

Damit erhalten Sie die Pixelbreite in Zoll

    
Pyrolistical 07.01.2009 22:03
quelle
1

GetDeviceCaps kann P / Invoke'd sein, um zu erhalten einige Zahlen, aber ich habe nie gewusst, dass die Zahlen so vertrauenswürdig sind ...

    
Rowland Shaw 07.01.2009 22:07
quelle
0

Sie können die physischen Abmessungen des Bildschirms mit den in der Registrierung gespeicherten EDID-Informationen ermitteln. Sie können den Registrierungsschlüssel des entsprechenden Monitors mithilfe des Windows-API-Aufrufs EnumDisplayDevices abrufen.

Physical Dimensions für das Screen-Objekt :

    
Breakskater 08.09.2010 15:51
quelle

Tags und Links