Convertir píxeles a puntos

125

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

Todd Davis
fuente

Respuestas:

198

Hay 72 puntos por pulgada ; Si es suficiente asumir 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 compatibles con DPI" , busque la sección "Creación de fuentes compatibles con DPI".

El W3C ha definido la medición de píxeles pxcomo exactamente 1/96 de 1 pulgada, 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.

Mark Ransom
fuente
26
72 puntos por pulgada NO es un elemento discutible, ¡es lo mismo en todos los ámbitos!
Mitchel Sellers
11
@David dpi depende de la pantalla, ppi es una constante tipográfica
Corey Ross
3
@David ese artículo solo explica por qué los monitores tienen DPI variable. PPI sigue siendo el mismo. La cantidad de kilómetros en una milla no cambia según el automóvil que conduzca. Asumir que 96 ppp generalmente no es una buena idea, pero si lo hacemos, entonces la fórmula dada es correcta.
Quentin
13
Por lo general, PPI es la abreviatura de píxeles por pulgada, no puntos por pulgada. ¿Quizás de ahí viene la confusión? Los puntos por pulgada son siempre 72; gracias por el enlace Xetius.
Mark Ransom
@ Corey Ross: En realidad, DPI dependería de la impresora, mientras que PPI estaría pendiente del monitor. Pero todos erróneamente llaman PPI DPI ...
Stefan Steiger
58

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

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Hejazi
fuente
2
¿Vale la pena señalar que DpiX es para Ancho donde DpiY debe usarse para altura?
PandaWood
25

Asumir 96 ppp es un gran error. Incluso si la suposición es correcta, también hay una opción para escalar las fuentes. Por lo tanto, un conjunto de fuentes para 10 puntos puede mostrarse como si fuera 12,5 puntos (125%).

Joel Coehoorn
fuente
23

Comenzando con lo dado:

  • Hay 72 puntos en una pulgada (eso 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 desea encontrar puntos (pt) basados ​​en píxeles (px):

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

Reorganizando:

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

entonces:

points = (pixels / 150) * 72    (3) for 150dpi system
Ian Boyd
fuente
1
ppp en la primera ecuación debe ser px - para cancelar términos, ya que tenemos la suposición (1) para el sistema de 150 ppp
Jason S
9

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

Heind
fuente
También explique por qué se usa este valor ... Casualmente, es de 96 ppp (DPI predeterminado de las ventanas para pantallas) / 72 ppp (DPI en el que se definen los puntos).
HA SALIDO - Anony-Mousse
5

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 de puntos (72 puntos por pulgada) a píxeles.

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

chinche
fuente
4

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 pulgada, del mismo modo que una "pica" se define como 1/72 de pie). Con estos dos bits de información puede convertir de px a pt y viceversa con mucha facilidad.

JeeBee
fuente
Para hacerlo aún más complicado, estoy tratando de alinear las cosas en un informe de Reporting Services (RDL) que se está convirtiendo en un PDF. Al final del día, ¿quién diablos sabe cuál es el DPI? Estoy usando mi mejor conjetura. :)
Todd Davis
Quiere decir "¿Cómo obtengo el DPI horizontal y vertical del monitor?". PPI es una constante de 72. Siempre lo ha sido y siempre lo será.
Xetius el
1
Píxeles por pulgada, no puntos por pulgada (Pica).
JeeBee el
1
Um, ¡Uy, no Pica! Eso es 1/6 de pulgada. Los puntos por pulgada son redundantes, el término es "puntos". Un "punto" es 1/72 de pulgada.
JeeBee el
4

En realidad debe ser

points = pixels * 96 / 72
david
fuente
1
Esto es incorrecto si presume 96 ppp y 72 ppp (puntos por pulgada). Serán puntos = píxeles * 72/96
Jason S
4

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

puntos = (píxeles / 72) * 72 en una Mac estándar con OSX (valores predeterminados de fábrica)

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

72 puntos POSTSCRIPT = 1 pulgada 12 puntos POSTSCRIPT = 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 píxeles / 16 = em

Bubba Tbone
fuente
1

Esto funciona:

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

Usando wxPython en Mac para obtener el DPI correcto de la siguiente manera:

    from wx import ScreenDC
    from wx import Size

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

Esto produce:

x-DPI: 72 y-DPI: 72

Por lo tanto, la fórmula es:

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

hasii
fuente
-1

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

daniel
fuente