Converti pixel in punti


125

Ho bisogno di convertire i pixel in punti in C #. Ho visto alcune spiegazioni complicate sull'argomento, ma non riesco a individuare una formula semplice. Supponiamo che un 96 dpi standard, come posso calcolare questa conversione?

Risposte:


198

Ci sono 72 punti per pollice ; se è sufficiente assumere 96 pixel per pollice, la formula è piuttosto semplice:

punti = pixel * 72/96

C'è un modo per ottenere i pixel configurati per pollice del display in Windows usando GetDeviceCaps. Microsoft ha una guida chiamata "Sviluppo di applicazioni DPI-Consapevoli" , cerca la sezione "Creazione di font DPI-Consapevoli".

Il W3C ha definito la misurazione dei pixel pxesattamente come 1/96 di 1 in indipendentemente dalla risoluzione effettiva del display, quindi la formula sopra dovrebbe essere valida per tutto il lavoro sul web.


26
72 punti per pollice NON è un oggetto discutibile, è lo stesso su tutta la linea!
Venditori di Mitchel,

11
@David dpi dipende dal display, ppi è una costante tipografica
Corey Ross,

3
@David quell'articolo spiega solo perché i monitor hanno DPI variabili. PPI è sempre lo stesso. Il numero di chilometri in un miglio non cambia in base all'auto che guidi. Supponendo che 96 dpi non sia generalmente una buona idea, ma se lo facciamo, la formula fornita è corretta.
Quentin,

13
Di solito PPI è l'abbreviazione di pixel per pollice, non punti per pollice. Forse è da lì che viene la confusione? I punti per pollice sono sempre 72; grazie per il link Xetius.
Mark Ransom,

@Corey Ross: In realtà, DPI dipenderebbe dalla stampante, mentre PPI penderebbe dal monitor. Ma tutti chiamano erroneamente DPI DPI ...
Stefan Steiger

58

Prova questo se il tuo codice si trova in una forma:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();

2
Vale la pena sottolineare che DpiX è per Larghezza dove DpiY dovrebbe essere usato per l'altezza?
PandaWood,

25

Supporre che 96 dpi sia un errore enorme . Anche se il presupposto è giusto, c'è anche un'opzione per ridimensionare i caratteri. Quindi un set di caratteri per 10 punti potrebbe effettivamente essere mostrato come se fosse 12,5 pt (125%).


23

A partire dal dato:

  • Ci sono 72 punti in un pollice (che è un punto, 1/72 di pollice)
  • su un sistema impostato per 150 dpi, ci sono 150 pixel per pollice.
  • 1 in = 72pt = 150px (per impostazione 150 dpi)

Se vuoi trovare punti (pt) in base a pixel (px):

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

Riorganizzare:

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

così:

points = (pixels / 150) * 72    (3) for 150dpi system

1
dpi nella prima equazione dovrebbe essere px - per la cancellazione dei termini, dato che abbiamo il presupposto (1) per il sistema a 150 dpi
Jason S

9

WPF converte i punti in pixel con System.Windows.FontSizeConverter. FontSizeConverter utilizza System.Windows.LengthConverter. Il LengthConverter utilizza il fattore 1.33333333333333333333 per convertire da punti (p) a pixel (x): x = p * 1.3333333333333333


Spiega anche perché questo valore viene utilizzato ... Per coincidenza, è 96 dpi (DPI predefinito di Windows per i display) / 72 dpi (DPI a cui sono definiti i punti).
Ha QUIT - Anony-Mousse l'

5

System.Drawing.Graphics ha proprietà DpiX e DpiY. DpiX è pixel per pollice in orizzontale. DpiY è pixel per pollice in verticale. Usa quelli per convertire da punti (72 punti per pollice) in pixel.

Esempio: 14 punti orizzontali = (14 * DpiX) / 72 pixel


4

Sicuramente l'intera domanda dovrebbe essere:

"Come posso ottenere il PPI orizzontale e verticale (pixel per pollice) del monitor?"

Ci sono 72 punti in un pollice (per definizione, un "punto" è definito come 1/72 di pollice, allo stesso modo una "pica" è definita come 1/72 di piede). Con questi due bit di informazioni puoi convertire da px in pt e viceversa molto facilmente.


Per renderlo ancora più complicato, mi occupo di allineare le cose su un report di Reporting Services (RDL) che viene convertito in PDF. Alla fine, chi diamine sa cos'è il DPI? Sto usando la mia ipotesi migliore. :)
Todd Davis,

Intendi "Come posso ottenere il DPI orizzontale e verticale del monitor?". PPI è una costante di 72. È sempre stato e sempre lo sarà.
Xetius,

1
Pixel per pollice, non punti per pollice (Pica).
JeeBee,

1
Uhm, oops, non Pica! Questo è 1/6 di pollice. I punti per pollice sono ridondanti, il termine è "punti". Un "Punto" è 1/72 di un pollice.
JeeBee,

4

In realtà deve essere

points = pixels * 96 / 72

1
Ciò non è corretto se si presume che 96 dpi e 72ppi (punti per pollice). Saranno punti = pixel * 72/96
Jason S

4

punti = (pixel / 96) * 72 su una macchina XP / Vista / 7 standard (impostazioni di fabbrica)

punti = (pixel / 72) * 72 su un Mac standard con OSX (impostazioni di fabbrica)

Windows funziona di default a 96 dpi (display) I Mac funzionano di default a 72 dpi (display)

72 punti POSTSCRIPT = 1 pollice 12 punti POSTSCRIPT = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 punti = 1 pollice

1 punto = 1⁄72 pollici = 25,4⁄72 mm = 0,3527 mm

DPI = Punti per pollice PPI = Pixel per pollice LPI = Linee per pollice

Maggiori informazioni se li usi come misura

16px = 1em (impostazione predefinita per il testo normale) 8em = 16px * 8 Pixel / 16 = em


1

Questo funziona:

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

0

Utilizzando wxPython su Mac per ottenere il DPI corretto come segue:

    from wx import ScreenDC
    from wx import Size

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

Questo produce:

x-DPI: 72 y-DPI: 72

Pertanto, la formula è:

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


-1

Linee di altezza convertite in punti e pixel (la mia formula). Ecco un esempio con l'immissione manuale di 213,67 punti nel campo Altezza riga:

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

Qui l'inserimento manuale di 213,67 punti dà 284 pixel.
Qui l'inserimento manuale di 213,68 punti dà 285 pixel.

(Perché 0.45? Non lo so ma funziona.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.