Converter pixels em pontos


125

Preciso converter pixels em pontos em c #. Eu já vi algumas explicações complicadas sobre o tópico, mas não consigo localizar uma fórmula simples. Vamos assumir um padrão de 96 dpi, como calculo essa conversão?

Respostas:


198

Existem 72 pontos por polegada ; se for suficiente assumir 96 pixels por polegada, a fórmula é bastante simples:

pontos = pixels * 72/96

Existe uma maneira de obter os pixels configurados por polegada da tela no Windows usando GetDeviceCaps. A Microsoft possui um guia chamado "Desenvolvendo aplicativos com reconhecimento de DPI" , procure a seção "Criando fontes com reconhecimento de DPI".

O W3C definiu a medição de pixel pxcomo exatamente 1/96 de 1in, independentemente da resolução real da tela, portanto, a fórmula acima deve ser boa para todo o trabalho na web.


26
72 pontos por polegada NÃO é um item discutível, é o mesmo em todos os aspectos!
Mitchel Sellers

11
O @David dpi depende da exibição, o ppi é uma constante tipográfica #
Corey Ross

3
@ David esse artigo apenas explica por que os monitores têm DPI variável. PPI ainda é o mesmo. O número de quilômetros em uma milha não muda dependendo do carro que você dirige. Supondo que 96dpi geralmente não é uma boa ideia, mas se fizermos isso, a fórmula fornecida estará correta.
Quentin

13
Normalmente, PPI é a abreviação de pixels por polegada, não de pontos por polegada. Talvez seja daí que a confusão vem? Pontos por polegada são sempre 72; obrigado pelo link Xetius.
Mark Ransom

@ Corey Ross: Na verdade, o DPI seria dependente da impressora, enquanto o PPI seria pendente do monitor. Mas todo mundo erroneamente chama PPI DPI ...
Stefan Steiger

58

Tente isso se o seu código estiver em um formulário:

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

2
Vale ressaltar que DpiX é para Largura, onde DpiY deve ser usado para altura?
PandaWood 10/08/16

25

Assumir 96dpi é um grande erro. Mesmo se a suposição estiver correta, também há uma opção para dimensionar fontes. Portanto, uma fonte definida para 10pts pode realmente ser mostrada como se fosse 12,5pt (125%).


23

Começando com o dado:

  • Existem 72 pontos em uma polegada (é isso que é um ponto, 1/72 de uma polegada)
  • em um sistema definido para 150 dpi, há 150 pixels por polegada.
  • 1 pol = 72pt = 150 px (para configuração de 150 dpi)

Se você deseja encontrar pontos (pt) com base em pixels (px):

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

Reorganizando:

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

tão:

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

1
dpi na primeira equação deve ser px - para o cancelamento dos termos, uma vez que temos a suposição (1) para 150dpi sistema
Jason S

9

O WPF converte pontos em pixels com o System.Windows.FontSizeConverter. O FontSizeConverter usa o System.Windows.LengthConverter. O LengthConverter usa o fator 1.333333333333333333 para converter de pontos (p) para pixels (x): x = p * 1.333333333333333333


Explique também por que esse valor é usado ... Por coincidência, é 96 dpi (DPI padrão das janelas para telas) / 72 dpi (DPI em que os pontos são definidos).
QuIT - Anony-Mousse

5

System.Drawing.Graphics possui propriedades DpiX e DpiY. DpiX é pixels por polegada horizontalmente. DpiY é pixels por polegada na vertical. Use para converter de pontos (72 pontos por polegada) em pixels.

Ex: 14 pontos horizontais = (14 * DpiX) / 72 pixels


4

Certamente toda essa questão deve ser:

"Como obtenho o PPI horizontal e vertical (pixels por polegada) do monitor?"

Existem 72 pontos em uma polegada (por definição, um "ponto" é definido como 1/72 da polegada, da mesma forma que um "pica" é definido como 1/72 da polegada). Com esses dois bits de informação, você pode converter de px para pt e voltar com muita facilidade.


Para tornar ainda mais complicado, estou lidando com o alinhamento de coisas em um relatório do RDL (Reporting Services) que está sendo convertido em PDF. No final do dia, quem diabos sabe o que é o DPI? Estou usando meu melhor palpite. :)
Todd Davis

Você quer dizer "Como obtenho o DPI horizontal e vertical do monitor?". O PPI é uma constante de 72. Sempre foi e sempre será.
Xetius 03/07/2009

1
Pixels por polegada, não pontos por polegada (Pica).
21413 JeeBee

1
Hum, opa, não Pica! Isso é 1/6 de polegada. Pontos por polegada é redundante, o termo é "Pontos". Um "ponto" é 1/72 da polegada.
21710 JeeBee

4

Na verdade, deve ser

points = pixels * 96 / 72

1
Isso está incorreto se você estiver presumindo 96dpi e 72ppi (pontos por polegada). Será pontos = pixels * 72/96
Jason S

4

pontos = (pixels / 96) * 72 em uma máquina XP / Vista / 7 padrão (padrões de fábrica)

points = (pixels / 72) * 72 em um Mac padrão executando o OSX (padrões de fábrica)

Windows é executado como padrão em 96dpi (tela) Macs é executado como padrão em 72 dpi (tela)

72 pontos de POSTSCRIPT = 1 polegada 12 pontos de POSTSCRIPT = 1 polegada de POSTSCRIPT 6 picas de POSTSCRIPT = 72 pontos = 1 polegada

1 ponto = 1⁄72 polegadas = 25,4⁄72 mm = 0,3527 mm

DPI = pontos por polegada PPI = pixels por polegada LPI = linhas por polegada

Mais informações se usá-los como medidas

16px = 1em (padrão para texto normal) 8em = 16px * 8 pixels / 16 = em


1

Isso funciona:

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

0

Usando o wxPython no Mac para obter o DPI correto da seguinte maneira:

    from wx import ScreenDC
    from wx import Size

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

Isso produz:

x-DPI: 72 y-DPI: 72

Assim, a fórmula é:

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


-1

Linhas de altura convertidas em pontos e pixels (minha própria fórmula). Aqui está um exemplo com uma entrada manual de 213,67 pontos no campo Altura da linha:

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

Aqui, a entrada manual de 213,67 pontos fornece 284 pixels.
Aqui, a entrada manual de 213,68 pontos fornece 285 pixels.

(Por que 0,45? Eu não sei, mas funciona.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.