Convertir des pixels en points
Question
J'ai besoin de convertir des pixels en points en C #. J'ai vu des explications compliquées sur le sujet, mais n'arrive pas à trouver une formule simple. Supposons une résolution standard de 96 ppp, comment calculer cette conversion?
La solution
Il existe 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 affichage dans Windows à l'aide de GetDeviceCaps
. Microsoft propose un guide intitulé "Développement d'applications DPI-Aware" , consultez pour la section "Création de polices DPI-Aware".
Le W3C a défini la mesure de pixels px
exactement 1 / 96ème de 1in quelle que soit la résolution réelle de votre affichage, la formule ci-dessus devrait donc convenir à tous les travaux Web.
Autres conseils
Essayez ceci si votre code réside dans un formulaire:
Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
En supposant que 96 dpi soit une énorme erreur. Même si l'hypothèse est correcte, il existe également une option pour redimensionner les polices. Ainsi, une police définie pour 10pts peut en réalité être affichée comme si elle était 12.5pt (125%).
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 défini à 150 dpi, il y a 150 pixels par pouce.
- 1 in = 72pt = 150px (pour un paramètre de 150 dpi)
Si vous souhaitez rechercher des points (pt) basés sur des pixels (px):
72 pt x pt
------ = ----- (1) for 150dpi system
150 px y px
Réorganisation:
x = (y/150) * 72 (2) for 150dpi system
alors:
points = (pixels / 150) * 72 (3) for 150dpi system
WPF convertit les points en pixels avec System.Windows.FontSizeConverter. FontSizeConverter utilise System.Windows.LengthConverter. LengthConverter utilise le facteur 1,333333333333333333 pour convertir les points (p) en pixels (x): x = p * 1,3333333333333333
System.Drawing.Graphics a les propriétés DpiX et DpiY. DpiX est pixel par pouce horizontalement. DpiY est pixel par pouce verticalement. Utilisez-les pour convertir des points (72 points par pouce) en pixels.
Ex: 14 points horizontaux = (14 * DpiX) / 72 pixels
Assurément, toute cette question devrait être:
"Comment obtenir les PPI (pixels par pouce) horizontaux et verticaux du moniteur?"
Il y a 72 points dans un pouce (par définition, un "point" est défini à 1 / 72ème de pouce, de même qu'un "pica" est défini à 1 / 72ème de pied). Avec ces deux bits d’information, vous pouvez convertir très facilement du px au pt.
En fait, ce doit être
points = pixels * 96 / 72
points = (pixels / 96) * 72 sur une machine standard XP / Vista / 7 (paramètres par défaut)
points = (pixels / 72) * 72 sur un Mac standard fonctionnant sous OSX (paramètres par défaut)
Windows fonctionne par défaut à 96 dpi (affichage) Les Mac fonctionnent par défaut à 72 dpi (affichage)
72 points POSTSCRIPT = 1 pouce 12 points POSTSCRIPT = 1 POSTSCRIPT Pica 6 Picas POSTSCRIPT = 72 Points = 1 pouce
1 point = 1 & # 8260; 72 pouces = 25,4 & # 8260; 72 mm = 0,3527 mm
DPI = points par pouce IPP = pixels par pouce LPI = lignes par pouce
Plus d'infos si vous utilisez em comme mesure
16px = 1em (valeur par défaut pour le texte normal) 8em = 16px * 8 Pixels / 16 = em
Ceci fonctionne:
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
Lignes de hauteur converties en points et en pixels (ma propre formule). Voici un exemple avec une entrée 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, l'entrée manuelle de 213,68 points donne 285 pixels.
(Pourquoi 0,45? Je ne sais pas mais ça marche.)