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?
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:
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 px
como 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.
Tente isso se o seu código estiver em um formulário:
Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
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%).
Começando com o dado:
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
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
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
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.
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
Isso funciona:
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
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
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.)