Konvertieren Pixel zu Punkte
Frage
Ich habe eine Notwendigkeit Pixel auf Punkte in C # zu konvertieren. Ich habe einige komplizierten Erklärungen über das Thema gesehen, aber kann nicht scheinen, eine einfache Formel zu finden. Lassen Sie uns einen Standard 96 dpi annehmen, wie calulate ich diese Umwandlung?
Lösung
Es gibt 72 Punkte pro Zoll ; wenn es ausreichend ist, 96 Pixel pro Zoll zu übernehmen, die Formel ist einfach:
Punkte = Pixel * 72/96
Es gibt eine Möglichkeit, die konfiguriert Pixel pro Zoll Ihrer Anzeige in Windows mit GetDeviceCaps
. Microsoft hat einen Leitfaden namens "Die Entwicklung von DPI-Aware Applications" , suchen Sie nach der Abschnitt "Erstellen von DPI-Aware Fonts".
Das W3C hat das Pixel Messung px
definiert als genau 1 / 96th of 1in unabhängig von der tatsächlichen Auflösung des Bildschirms, so dass die obige Formel sollte für alle Web-Arbeit gut sein.
Andere Tipps
Versuchen Sie dies, wenn Ihr Code in einer Form liegt:
Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Unter der Annahme, 96 dpi ist ein große Fehler. Auch wenn die Annahme richtig ist, gibt es auch eine Option Schriftarten zu skalieren. So eine Schriftart für 10 Punkte gesetzt tatsächlich gezeigt werden kann, als ob es 12.5pt (125%).
Beginnend mit dem angegeben:
- Es gibt 72 Punkte in einem Zoll (das ist das, was ein Punkt ist, 1/72 Zoll)
- auf einem System-Set für 150dpi gibt es 150 Pixel pro Zoll.
- 1 in = 72pt = 150px (für 150 dpi-Einstellung)
Wenn Sie möchten, Punkte finden (pt) basierend auf Pixel (px):
72 pt x pt
------ = ----- (1) for 150dpi system
150 px y px
Rearranging:
x = (y/150) * 72 (2) for 150dpi system
so:
points = (pixels / 150) * 72 (3) for 150dpi system
WPF wandelt Punkte auf Pixel mit dem System.Windows.FontSizeConverter. Die FontSizeConverter verwendet die System.Windows.LengthConverter. Der LengthConverter verwendet den Faktor 1,333333333333333333 von Punkten (p) auf Pixel (x) zu konvertieren: x = p * 1,3333333333333333
System.Drawing.Graphics hat DpiX und DpiY Eigenschaften. DpiX ist Pixel pro Zoll in horizontaler Richtung. DpiY ist Pixel pro Zoll in vertikaler Richtung. Verwenden, um die von den Punkten zu konvertieren (72 Punkte pro Inch) auf Pixel.
Ex: 14 horizontal Punkte = (14 * DpiX) / 72 Pixel
Sicherlich diese ganze Frage sollte sein:
„Wie erhalte ich die horizontale und vertikale PPI (Pixel pro Zoll) des Monitors?“
Es gibt 72 Punkte in Inch (per Definition ein „Punkt“ ist definiert als 1 / 72nd eines Inch, ebenfalls ein „Pica“ ist definiert als 1 / 72nd eines Fußes). Mit diesen beiden Bits an Informationen können Sie von px zu konvertieren sehr leicht zu pt und zurück.
Eigentlich muss es sein
points = pixels * 96 / 72
Punkte = (Pixel / 96) * 72 auf eine Standard-XP / Vista / 7 Maschine (Werkseinstellung)
Punkte = (Pixel / 72) * 72 auf einem Standard-Mac mit OSX (Werkseinstellung)
Windows läuft als Standard mit 96 dpi (Anzeige) Macs als Standard laufen bei 72 dpi (Anzeige)
72 POSTSCRIPT- Punkte = 1 Zoll 12 POSTSCRIPT- Punkte = 1 POSTSCRIPT- Pica 6 POSTSCRIPT- Pica = 72 Punkte = 1 Zoll
1 Punkt = 1/72 Zoll = 25.4/72 mm = 0,3527 mm
DPI = Dots Per Inch PPI = Pixel pro Zoll LPI = Zeilen pro Zoll
Weitere Informationen, wenn mit em als Mess
16px = 1em (Standard für normalen Text) 8em = 16px * 8 Pixel / 16 = em
Das funktioniert:
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
Höhenlinien umgewandelt in Punkte und Pixel (meine eigene Formel). Hier ist ein Beispiel mit einer manuellen Eingabe von 213,67 Punkten in der Zeilenhöhe Feld:
213.67 Manual Entry
0.45 Add 0.45
214.12 Subtotal
213.75 Round to a multiple of 0.75
213.00 Subtract 0.75 provides manual entry converted by Excel
284.00 Divide by 0.75 gives the number of pixels of height
Hier ist die manuelle Eingabe von 213,67 Punkten gibt 284 Pixel.
Hier ist die manuelle Eingabe von 213,68 Punkten gibt 285 Pixel.
(Warum 0.45? Ich weiß nicht, aber es funktioniert.)