Konvertieren Sie Pixel in Punkte

125

Ich muss Pixel in Punkte in C # konvertieren. Ich habe einige komplizierte Erklärungen zu diesem Thema gesehen, kann aber keine einfache Formel finden. Nehmen wir einen Standardwert von 96 dpi an. Wie berechne ich diese Konvertierung?

Todd Davis
quelle

Antworten:

198

Es gibt 72 Punkte pro Zoll ; Wenn es ausreicht, 96 Pixel pro Zoll anzunehmen, ist die Formel ziemlich einfach:

Punkte = Pixel * 72/96

Es gibt eine Möglichkeit, die konfigurierten Pixel pro Zoll Ihres Displays in Windows mithilfe von zu ermitteln GetDeviceCaps. Microsoft hat eine Anleitung mit dem Titel "Entwickeln von DPI-Aware-Anwendungen" . Lesen Sie den Abschnitt "Erstellen von DPI-Aware-Schriftarten".

Das W3C hat die Pixelmessung unabhängig von der tatsächlichen Auflösung Ihres Displays pxals genau 1/96 von 1 Zoll definiert. Daher sollte die obige Formel für alle Webarbeiten geeignet sein .

Mark Ransom
quelle
26
72 Punkte pro Zoll ist KEIN strittiger Gegenstand, er ist auf der ganzen Linie gleich!
Mitchel Sellers
11
@ David dpi ist abhängig von der Anzeige, ppi ist eine typografische Konstante
Corey Ross
3
@ David dieser Artikel erklärt nur, warum Monitore variable DPI haben. PPI ist immer noch das gleiche. Die Anzahl der Kilometer pro Meile ändert sich nicht je nach dem Auto, das Sie fahren. Angenommen, 96 dpi sind im Allgemeinen keine gute Idee, aber wenn wir das tun, ist die angegebene Formel korrekt.
Quentin
13
Normalerweise ist PPI die Abkürzung für Pixel pro Zoll, nicht für Punkte pro Zoll. Vielleicht kommt die Verwirrung von dort? Punkte pro Zoll sind immer 72; Danke für den Link Xetius.
Mark Ransom
@Corey Ross: Eigentlich wäre DPI vom Drucker abhängig, während PPI vom Monitor abhängig wäre. Aber jeder nennt PPI DPI fälschlicherweise ...
Stefan Steiger
58

Versuchen Sie dies, wenn Ihr Code in einer Form vorliegt:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Hejazi
quelle
2
Ist es erwähnenswert, dass DpiX für die Breite ist, wo DpiY für die Höhe verwendet werden sollte?
PandaWood
25

Die Annahme von 96 dpi ist ein großer Fehler. Auch wenn die Annahme richtig ist, gibt es auch eine Option zum Skalieren von Schriftarten. Eine für 10 Punkte festgelegte Schriftart kann also tatsächlich so angezeigt werden, als ob sie 12,5 Punkte (125%) beträgt.

Joel Coehoorn
quelle
23

Beginnend mit dem Gegebenen:

  • Es gibt 72 Punkte in einem Zoll (das ist, was ein Punkt ist, 1/72 Zoll)
  • Auf einem System mit 150 dpi sind 150 Pixel pro Zoll vorhanden.
  • 1 in = 72pt = 150px (für 150dpi-Einstellung)

Wenn Sie Punkte (pt) basierend auf Pixeln (px) finden möchten:

 72 pt    x pt
------ = -----                  (1) for 150dpi system
150 px    y px

Neuanordnung:

x = (y/150) * 72                (2) for 150dpi system

so:

points = (pixels / 150) * 72    (3) for 150dpi system
Ian Boyd
quelle
1
dpi in der ersten Gleichung sollte px sein - zum Aufheben von Begriffen, da wir die Annahme (1) für ein 150dpi-System haben
Jason S
9

WPF konvertiert Punkte mit dem System.Windows.FontSizeConverter in Pixel. Der FontSizeConverter verwendet den System.Windows.LengthConverter. Der LengthConverter verwendet den Faktor 1.33333333333333333333, um von Punkten (p) in Pixel (x) zu konvertieren: x = p * 1.3333333333333333

Heind
quelle
Bitte erläutern Sie auch, warum dieser Wert verwendet wird ... Zufälligerweise beträgt er 96 dpi (Standard-DPI von Fenstern für Anzeigen) / 72 dpi (DPI, bei der Punkte definiert sind).
Hat aufgehört - Anony-Mousse
5

System.Drawing.Graphics verfügt über DpiX- und DpiY-Eigenschaften. DpiX ist horizontal Pixel pro Zoll. DpiY ist vertikal Pixel pro Zoll. Verwenden Sie diese, um von Punkten (72 Punkte pro Zoll) in Pixel umzuwandeln.

Beispiel: 14 horizontale Punkte = (14 * DpiX) / 72 Pixel

Spotcatbug
quelle
4

Sicherlich sollte diese ganze Frage lauten:

"Wie erhalte ich den horizontalen und vertikalen PPI (Pixel pro Zoll) des Monitors?"

Es gibt 72 Punkte in einem Zoll (per Definition ist ein "Punkt" als 1/72 Zoll definiert, ebenso ein "Pica" als 1/72 Fuß). Mit diesen beiden Informationen können Sie sehr einfach von px nach pt und zurück konvertieren.

JeeBee
quelle
Um es noch komplizierter zu machen, beschäftige ich mich mit dem Ausrichten von Dingen in einem Reporting Services-Bericht (RDL), der in ein PDF konvertiert wird. Wer zum Teufel weiß am Ende des Tages, was die DPI ist? Ich benutze meine beste Vermutung. :)
Todd Davis
Sie meinen "Wie erhalte ich die horizontale und vertikale DPI des Monitors?". PPI ist eine Konstante von 72. Immer war und wird immer.
Xetius
1
Pixel pro Zoll, nicht Punkte pro Zoll (Pica).
JeeBee
1
Ähm, oops, nicht Pica! Das ist 1/6 Zoll. Punkte pro Zoll sind überflüssig, der Begriff lautet "Punkte". Ein "Punkt" ist 1/72 Zoll.
JeeBee
4

Eigentlich muss es sein

points = pixels * 96 / 72
David
quelle
1
Dies ist falsch, wenn Sie 96 dpi und 72 ppi (Punkte pro Zoll) annehmen. Es wird Punkte = Pixel * 72/96 sein
Jason S
4

Punkte = (Pixel / 96) * 72 auf einem Standard-XP / Vista / 7-Computer (Werkseinstellungen)

Punkte = (Pixel / 72) * 72 auf einem Standard-Mac mit OSX (Werkseinstellungen)

Windows wird standardmäßig mit 96 dpi (Anzeige) ausgeführt. Macs werden standardmäßig mit 72 dpi (Anzeige) ausgeführt.

72 POSTSCRIPT-Punkte = 1 Zoll 12 POSTSCRIPT-Punkte = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 Punkte = 1 Zoll

1 Punkt = 1⁄72 Zoll = 25,4⁄72 mm = 0,3527 mm

DPI = Punkte pro Zoll PPI = Pixel pro Zoll LPI = Linien pro Zoll

Weitere Informationen bei Verwendung als Messgröße

16px = 1em (Standard für normalen Text) 8em = 16px * 8 Pixel / 16 = em

Bubba Tbone
quelle
1

Das funktioniert:

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
Michael Zhang
quelle
0

Verwenden Sie wxPython auf einem Mac, um die richtige DPI wie folgt zu erhalten:

    from wx import ScreenDC
    from wx import Size

    size: Size = ScreenDC().GetPPI()
    print(f'x-DPI: {size.GetWidth()} y-DPI: {size.GetHeight()}')

Dies ergibt:

x-DPI: 72 y-DPI: 72

Die Formel lautet also:

Punkte: int = (pixelNumber * 72) // 72

hasii
quelle
-1

Höhenlinien in Punkte und Pixel umgewandelt (meine eigene Formel). Hier ist ein Beispiel mit einer manuellen Eingabe von 213,67 Punkten in das Feld Zeilenhöhe:

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 ergibt die manuelle Eingabe von 213,67 Punkten 284 Pixel.
Hier ergibt die manuelle Eingabe von 213,68 Punkten 285 Pixel.

(Warum 0,45? Ich weiß es nicht, aber es funktioniert.)

Daniel
quelle