Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I convert Twips to Pixels in .NET?

Tags:

I'm working on a migration project in which a database actually stores display sizes in twips. Since I can't use twips to assign sizes to WPF or Winforms controls, I was wondering if .NET has a conversion method usable at runtime?

like image 460
Chris Pfohl Avatar asked Oct 28 '10 15:10

Chris Pfohl


People also ask

How many Twips is an inch?

One twip is 1⁄1440 inch, or 17.64 μm.


2 Answers

It turns out that the migration tool has something, but it wouldn't do any good at runtime. Here's what I did (if the hard-coded value in the extension method were changed to the value for points per inch it would work as a point converter too):

1 Twip = 1/1440th of an inch. The .NET Graphics object has a method DpiX and DpiY which can be used to determine how many pixels are in an inch. Using those measurements I created the following extension methods for Graphics:

using System.Drawing;  static class Extensions {     /// <summary>     /// Converts an integer value in twips to the corresponding integer value     /// in pixels on the x-axis.     /// </summary>     /// <param name="source">The Graphics context to use</param>     /// <param name="inTwips">The number of twips to be converted</param>     /// <returns>The number of pixels in that many twips</returns>     public static int ConvertTwipsToXPixels(this Graphics source, int twips)     {         return (int)(((double)twips) * (1.0 / 1440.0) * source.DpiX);     }      /// <summary>     /// Converts an integer value in twips to the corresponding integer value     /// in pixels on the y-axis.     /// </summary>     /// <param name="source">The Graphics context to use</param>     /// <param name="inTwips">The number of twips to be converted</param>     /// <returns>The number of pixels in that many twips</returns>     public static int ConvertTwipsToYPixels(this Graphics source, int twips)     {         return (int)(((double)twips) * (1.0 / 1440.0) * source.DpiY);     } } 

To use these methods one simply has to do the following (assuming you're in a context where CreateGraphics returns a Drawing.Graphics object (here this is a Form, so CreateGraphics is inherited from Form's super-class Control):

using( Graphics g = CreateGraphics() ) {     Width = g.ConvertTwipsToXPixels(sizeInTwips);     Height = g.ConvertTwipsToYPixels(sizeInTwips); } 

See the "Remarks" section in the Graphics Class documentation for a list of ways to obtain a graphics object. More complete documentation is available in the tutorial How to: Create Graphics Objects.

Brief summary of easiest ways:

  • Control.CreateGraphics
  • a Paint event's PaintEventArgs has a Graphics available in its Graphics property.
  • Hand Graphics.FromImage an image and it will return a Graphics object that can draw on that image. (NOTE: It is unlikely that you'll want to use twips for an actual image)
like image 146
Chris Pfohl Avatar answered Oct 02 '22 17:10

Chris Pfohl


For migration projects we can use built in converstion support functions

microsoft.visualbasic.compatibility.vb6.twipsperpixelx microsoft.visualbasic.compatibility.vb6.twipsperpixely 
like image 28
Jayesh Avatar answered Oct 02 '22 17:10

Jayesh