I have a need to convert Pixels to Points in C#. I've seen some complicated explanations about the topic, but can't seem to locate a simple formula. Let's assume a standard 96dpi, how do I calulate this conversion?
Surely this whole question should be:
"How do I obtain the horizontal and vertical PPI (Pixels Per Inch) of the monitor?"
There are 72 points in an inch (by definition, a "point" is defined as 1/72nd of an inch, likewise a "pica" is defined as 1/72nd of a foot). With these two bits of information you can convert from px to pt and back very easily.
There are 72 points per inch; if it is sufficient to assume 96 pixels per inch, the formula is rather simple:
points = pixels * 72 / 96
There is a way to get the configured pixels per inch of your display, but it escapes me at the moment.
Edit: The function I was thinking of is GetDeviceCaps. Microsoft has a guide called "Developing DPI-Aware Applications", look for the section "Creating DPI-Aware Fonts".
Assuming 96dpi is a huge mistake. Even if the assumption is right, there's also an option to scale fonts. So a font set for 10pts may actually be shown as if it's 12.5pt (125%).
System.Drawing.Graphics has DpiX and DpiY properties. DpiX is pixels per inch horizontally. DpiY is pixels per inch vertically. Use those to convert from points (72 points per inch) to pixels.
Ex: 14 horizontal points = (14 * DpiX) / 72 pixels
Try this if your code lies in a form:
Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Starting with the given:
- There are 72 points in an inch (that is what a point is, 1/72 of an inch)
- on a system set for 150dpi, there are 150 pixels per inch.
- 1 in = 72pt = 150px (for 150dpi setting)
If you want to find points (pt) based on pixels (px):
72 pt x pt
------ = ----- (1) for 150dpi system
150dpi y px
Rearranging:
x = (y/150) * 72 (2) for 150dpi system
so:
points = (pixels / 150) * 72 (3) for 150dpi system
Height lines converted into points and pixel (My own formula) Here is an example with a manual entry of 213.67 points in the Row Height field:
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
Here the manual entry of 213.67 points gives 284 pixels Here the manual entry of 213.68 points gives 285 pixels Why 0.45? I do not know but it works
WPF converts points to pixels with the System.Windows.FontSizeConverter. The FontSizeConverter uses the System.Windows.LengthConverter. The LengthConverter uses the factor 1.333333333333333333 to convert from points (p) to pixels (x): x = p * 1.3333333333333333