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?
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:
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 px
esattamente 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.
Prova questo se il tuo codice si trova in una forma:
Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
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%).
A partire dal dato:
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
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
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
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.
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
Questo funziona:
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
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
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.)