2008-09-26 35 views
111

Necesito convertir píxeles en 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?Convertir píxeles a puntos

Respuesta

172

Hay 72 points per inch; si es suficiente para asumir 96 píxeles por pulgada, la fórmula es bastante simple:

puntos = píxeles * 72/96

Hay una manera de conseguir los píxeles configurados por pulgada de la pantalla en Windows utilizando GetDeviceCaps . Microsoft tiene una guía llamada "Developing DPI-Aware Applications", busque la sección "Creación de fuentes de DPI-Aware".

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

+25

72 puntos por pulgada NO es un elemento discutible, es el mismo en todos los ámbitos! –

+9

@David dpi depende de la pantalla, ppi es una constante tipográfica –

+0

No lo creo: http://www.retouchpro.com/forums/archive/t-10019.html – VVS

4

Sin duda, toda esta cuestión debería ser:

"? ¿Cómo se obtiene 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.

+0

Para hacerlo aún más complicado, estoy tratando de alinear cosas en un informe de Reporting Services (RDL) que se está convirtiendo en un PDF. Al final del día, ¿quién diablos sabe qué es el DPI? Estoy usando mi mejor suposición. :) –

+0

Quiere decir "¿Cómo obtengo el DPI vertical y horizontal del monitor?". PPI es una constante de 72. Siempre ha sido y siempre lo será. – Xetius

+1

píxeles por pulgada, no puntos por pulgada (Pica). – JeeBee

23

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

+2

Esto no parece ser una respuesta ... – MadSkunk

+7

@MadSkunk En septiembre de 2008, no pudimos dejar comentarios todavía. –

4

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.

Ex: 14 puntos horizontales = (14 * DPix)/72 píxeles

51

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

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

¿Vale la pena señalar que DpiX es para Width donde DpiY se debe usar para la altura? – PandaWood

15

A partir de lo dado:

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

Si usted quiere encontrar puntos (pt), basado 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 

manera:

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

ppp en la primera ecuación debe ser px - para cancelar los términos, ya que tenemos la suposición (1) para el sistema 150dpi –

4

En realidad debe ser

points = pixels * 96/72 
+1

Esto es incorrecto si se presupone 96dpi y 72ppi (puntos por pulgada). Será points = pixels * 72/96 –

-1

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

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 0,45? No lo sé, pero funciona.)

10

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

+0

Explique también * por qué * se utiliza este valor ... Coincidentemente, es 96 ppp (por defecto DPI de ventanas para pantallas)/72 ppp (DPI que los puntos están definidos en). –

+0

Me gusta esta respuesta, pero creo que debería ser solo "use FontSizeConverter", y déjalo así. – McKay

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 un Mac que funcionan con OS X (valores predeterminados de fábrica)

Windows se ejecuta por defecto en 96 ppp (pantalla) Mac corren por defecto a 72 ppp (pantalla)

72 POSTSCRIPT Points = 1 inch 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 se utiliza em como la medición de

16px = 1 em (por defecto para el texto normal) 8EM = 16px * 8 píxeles/16 = em

1

Esto funciona:

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