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?

Todd Davis
fonte

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.

Mark Ransom
fonte
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();
Hejazi
fonte
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%).

Joel Coehoorn
fonte
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
Ian Boyd
fonte
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

Heind
fonte
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

spotcatbug
fonte
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.

JeeBee
fonte
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
david
fonte
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

Bubba Tbone
fonte
1

Isso funciona:

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
Michael Zhang
fonte
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

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

daniel
fonte