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?

War es hilfreich?

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

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