Convierte píxeles a puntos

Tengo una necesidad de convertir píxeles a puntos en C #. He visto explicaciones complicadas sobre el tema, pero parece que no puedo encontrar una fórmula simple. Supongamos un 96dpi estándar, ¿cómo calculo esta conversión?

Hay 72 puntos por pulgada ; si es suficiente con 96 píxeles por pulgada, la fórmula es bastante simple:

puntos = píxeles * 72/96

Hay una manera de obtener los píxeles configurados por pulgada de su pantalla en Windows usando GetDeviceCaps . Microsoft tiene una guía llamada “Desarrollo de aplicaciones DPI-Aware” , busque la sección “Creación de fonts de DPI-Aware”.

El W3C ha definido la medición de píxeles px como exactamente 1 / 96o de 1in independientemente de la resolución real de su pantalla, por lo que la fórmula anterior debería ser buena para todo el trabajo web.

Pruebe esto si su código se encuentra en una forma:

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

Suponer 96dpi es un gran error. Incluso si la suposición es correcta, también hay una opción para escalar las fonts. Por lo tanto, una fuente establecida para 10 pts se puede mostrar realmente como si fuera 12.5pt (125%).

Comenzando con lo dado:

  • Hay 72 puntos en una pulgada (eso es lo que es un punto, 1/72 de pulgada)
  • en un sistema configurado para 150 ppp, hay 150 píxeles por pulgada.
  • 1 in = 72pt = 150px (para configuración de 150dpi)

Si quiere encontrar puntos (pt) basados ​​en píxeles (px):

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

Reordenando:

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

asi que:

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

WPF convierte puntos en píxeles con System.Windows.FontSizeConverter. FontSizeConverter usa System.Windows.LengthConverter. LengthConverter usa el factor 1.333333333333333333 para convertir de puntos (p) a píxeles (x): x = p * 1.3333333333333333

System.Drawing.Graphics tiene propiedades DpiX y DpiY. DpiX es píxeles por pulgada horizontalmente. DpiY es píxeles por pulgada verticalmente. Úselos para convertir puntos (72 puntos por pulgada) en píxeles.

Ej: 14 puntos horizontales = (14 * DpiX) / 72 píxeles

Seguramente toda esta pregunta debería ser:

“¿Cómo obtengo el PPI horizontal y vertical (Píxeles por pulgada) del monitor?”

Hay 72 puntos en una pulgada (por definición, un “punto” se define como 1/72 de una pulgada, del mismo modo una “pica” se define como 1 / 72o de un pie). Con estos dos bits de información puede convertir de px a pt y volver muy fácilmente.

En realidad debe ser

 points = pixels * 96 / 72 

puntos = (píxeles / 96) * 72 en una máquina estándar XP / Vista / 7 (valores predeterminados de fábrica)

points = (pixels / 72) * 72 en un Mac estándar que ejecuta OSX (valores predeterminados de fábrica)

Windows se ejecuta de manera predeterminada a 96 ppp (pantalla) Macs se ejecutan de manera predeterminada a 72 ppp (pantalla)

72 POSTSCRIPT Points = 1 pulgada 12 POSTSCRIPT Points = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 Puntos = 1 pulgada

1 punto = 1/72 pulgadas = 25.4/72 mm = 0.3527 mm

DPI = Puntos por pulgada PPI = Píxeles por pulgada LPI = Líneas por pulgada

Más información si usa em como medida

16px = 1em (predeterminado para texto normal) 8em = 16px * 8 Pixels / 16 = em

Esto funciona:

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

Líneas de altura convertidas en puntos y píxeles (mi propia fórmula). Aquí hay un ejemplo con una entrada manual de 213.67 puntos en el campo Altura de fila:

 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 

Aquí la entrada manual de 213.67 puntos da 284 píxeles.
Aquí la entrada manual de 213.68 puntos da 285 píxeles.

(¿Por qué 0.45? No lo sé, pero funciona).