Convertir les pixels en points

126

J'ai besoin de convertir des pixels en points en C #. J'ai vu des explications compliquées sur le sujet, mais je n'arrive pas à trouver une formule simple. Supposons un 96 dpi standard, comment puis-je calculer cette conversion?

Todd Davis
la source

Réponses:

199

Il y a 72 points par pouce ; s'il suffit de supposer 96 pixels par pouce, la formule est assez simple:

points = pixels * 72/96

Il existe un moyen d'obtenir les pixels configurés par pouce de votre écran dans Windows en utilisant GetDeviceCaps. Microsoft a un guide appelé "Développement d'applications DPI-Aware" , recherchez la section "Création de polices DPI-Aware".

Le W3C a défini la mesure des pixels pxcomme étant exactement 1 / 96e de 1in quelle que soit la résolution réelle de votre écran, la formule ci-dessus devrait donc convenir à tous les travaux Web.

Mark Ransom
la source
26
72 points par pouce n'est PAS un élément discutable, c'est la même chose dans tous les domaines!
Mitchel Sellers le
11
@David dpi dépend de l'affichage, ppi est une constante typographique
Corey Ross
3
@David cet article explique simplement pourquoi les moniteurs ont un DPI variable. PPI est toujours le même. Le nombre de kilomètres dans un mile ne change pas en fonction de la voiture que vous conduisez. En supposant que 96 dpi n'est généralement pas une bonne idée, mais si nous faisons cela, la formule donnée est correcte.
Quentin le
13
Habituellement, PPI est l'abréviation de pixels par pouce et non de points par pouce. C'est peut-être de là que vient la confusion? Les points par pouce sont toujours de 72; merci pour le lien Xetius.
Mark Ransom
@Corey Ross: En fait, le DPI dépendrait de l'imprimante, tandis que le PPI serait suspendu au moniteur. Mais tout le monde appelle à tort PPI DPI ...
Stefan Steiger
58

Essayez ceci si votre code se trouve sous une forme:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Hejazi
la source
2
Est-il intéressant de souligner que DpiX est pour la largeur où DpiY doit être utilisé pour la hauteur?
PandaWood
25

En supposant que 96 dpi est une énorme erreur. Même si l'hypothèse est juste, il existe également une option pour mettre à l'échelle les polices. Ainsi, un jeu de polices pour 10 points peut en fait être affiché comme s'il s'agissait de 12,5 points (125%).

Joël Coehoorn
la source
23

En commençant par le donné:

  • Il y a 72 points dans un pouce (c'est ce qu'est un point, 1/72 de pouce)
  • sur un système réglé pour 150 dpi, il y a 150 pixels par pouce.
  • 1 in = 72pt = 150px (pour un réglage 150 dpi)

Si vous souhaitez rechercher des points (pt) en fonction des pixels (px):

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

Réorganiser:

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

alors:

points = (pixels / 150) * 72    (3) for 150dpi system
Ian Boyd
la source
1
dpi dans la première équation devrait être px - pour l'annulation des termes, puisque nous avons l'hypothèse (1) pour un système 150 dpi
Jason S
9

WPF convertit les points en pixels avec le System.Windows.FontSizeConverter. FontSizeConverter utilise le System.Windows.LengthConverter. Le LengthConverter utilise le facteur 1.333333333333333333 pour convertir des points (p) en pixels (x): x = p * 1.3333333333333333

Heind
la source
Veuillez également expliquer pourquoi cette valeur est utilisée ... Par coïncidence, il s'agit de 96 dpi (DPI par défaut des fenêtres pour les affichages) / 72 dpi (DPI sur lesquels les points sont définis).
A QUITTER - Anony-Mousse
5

System.Drawing.Graphics a des propriétés DpiX et DpiY. DpiX correspond à des pixels par pouce horizontalement. DpiY correspond à des pixels par pouce verticalement. Utilisez-les pour convertir des points (72 points par pouce) en pixels.

Ex: 14 points horizontaux = (14 * DpiX) / 72 pixels

tache de chat
la source
4

Toute cette question devrait sûrement être:

"Comment obtenir le PPI (pixels par pouce) horizontal et vertical du moniteur?"

Il y a 72 points dans un pouce (par définition, un "point" est défini comme 1 / 72ème de pouce, de même un "pica" est défini comme 1 / 72ème de pied). Avec ces deux informations, vous pouvez convertir très facilement de px en pt et inversement.

JeeBee
la source
Pour rendre les choses encore plus compliquées, je suis en train d'aligner les choses sur un rapport Reporting Services (RDL) qui est en cours de conversion en PDF. À la fin de la journée, qui diable sait ce qu'est le DPI? J'utilise ma meilleure estimation. :)
Todd Davis le
Vous voulez dire "Comment obtenir le DPI horizontal et vertical du moniteur?". PPI est une constante de 72. Cela a toujours été et le sera toujours.
Xetius
1
Pixels par pouce, pas points par pouce (Pica).
JeeBee
1
Euh, oups, pas Pica! C'est 1 / 6e de pouce. Les points par pouce sont redondants, le terme est «points». Un «point» correspond à 1 / 72ème de pouce.
JeeBee
4

En fait ça doit être

points = pixels * 96 / 72
David
la source
1
Ceci est incorrect si vous présumez 96 dpi et 72ppi (points par pouce). Ce sera des points = pixels * 72/96
Jason S
4

points = (pixels / 96) * 72 sur une machine XP / Vista / 7 standard (paramètres d'usine par défaut)

points = (pixels / 72) * 72 sur un Mac standard exécutant OSX (paramètres d'usine par défaut)

Windows fonctionne par défaut à 96 ppp (affichage) Les Mac fonctionnent par défaut à 72 ppp (affichage)

72 points POSTSCRIPT = 1 pouce 12 points POSTSCRIPT = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 points = 1 pouce

1 point = 1⁄72 pouces = 25,4⁄72 mm = 0,3527 mm

DPI = points par pouce PPI = pixels par pouce LPI = lignes par pouce

Plus d'informations si vous les utilisez comme mesure

16px = 1em (par défaut pour le texte normal) 8em = 16px * 8 Pixels / 16 = em

Bubba Tbone
la source
1

Cela marche:

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

Utilisation de wxPython sur Mac pour obtenir le DPI correct comme suit:

    from wx import ScreenDC
    from wx import Size

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

Cela donne:

x-DPI: 72 y-DPI: 72

Ainsi, la formule est:

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

hasii
la source
-1

Lignes de hauteur converties en points et pixels (ma propre formule). Voici un exemple avec une saisie manuelle de 213,67 points dans le champ Hauteur de ligne:

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

Ici, la saisie manuelle de 213,67 points donne 284 pixels.
Ici, la saisie manuelle de 213,68 points donne 285 pixels.

(Pourquoi 0,45? Je ne sais pas mais ça marche.)

Daniel
la source