views:

25373

answers:

9

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?

A: 

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.

JeeBee
To make it even more complicated, I'm dealing with aligning things on a an Reporting Services (RDL) report which is being converted into a PDF. At the end of the day, who the heck knows what the DPI is? I'm using my best guess. :)
Todd Davis
You mean "How do I obtain the horizontal and vertical DPI of the monitor?". PPI is a constant of 72. Always has been and always will.
Xetius
Pixels Per Inch, not Points Per Inch (Pica).
JeeBee
Um, oops, not Pica! That's 1/6th of an inch. Points Per Inch is redundant, the term is "Points". A "Point" is 1/72nd of an Inch.
JeeBee
+18  A: 

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".

Mark Ransom
You can't say 72 ppi is a constant. It's depending on the display itself.
VVS
72 Points Per inch is NOT an arguable item, it is the same across the board!
Mitchel Sellers
@David dpi is dependent on the display, ppi is a typographic constant
Corey Ross
I don't think so: http://www.retouchpro.com/forums/archive/t-10019.html
VVS
@David that article just explains why monitors have variable DPI. PPI is still the same. The number of kilometers in a mile doesn't change depending on the car you drive.Assuming 96dpi is generally not a good idea, but if we do that then the given formula is correct.
David Dorward
Usually PPI is the abbreviation for pixels per inch, not points per inch. Perhaps that's where the confusion comes from? Points per inch are always 72; thanks for the link Xetius.
Mark Ransom
+7  A: 

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%).

Joel Coehoorn
+1  A: 

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

spotcatbug
+10  A: 

Try this if your code lies in a form:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Hejazi
+2  A: 

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
Ian Boyd
A: 

Actually it must be

points = pixels * 96 / 72
david
A: 

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

daniel
+1  A: 

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

Heind