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.
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.
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:
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:
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.)
Entschuldigung, Sie müssen P / Invoke für diese Information aufrufen.
Hier ist der Link, den ich vor einiger Zeit dafür benutzt habe: Ссылка
Sie können überprüfen, indem Sie einfach manuell von Ihrer Bildschirmgröße berechnen
%Vor%Damit erhalten Sie die Pixelbreite in Zoll
GetDeviceCaps
kann P / Invoke'd sein, um zu erhalten einige Zahlen, aber ich habe nie gewusst, dass die Zahlen so vertrauenswürdig sind ...
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.