web-dev-qa-db-ja.com

.NETでTwipsをピクセルに変換するにはどうすればよいですか?

私は、データベースが実際に表示サイズをtwipで保存する移行プロジェクトに取り組んでいます。 twipsを使用してWPFまたはWinformsコントロールにサイズを割り当てることができないため、.NETに実行時に使用可能な変換方法があるかどうか疑問に思いました。

24
Chris Pfohl

移行ツールには何かがあることがわかりましたが、実行時には何の役にも立ちません。これが私がしたことです(拡張メソッドのハードコードされた値が1インチあたりのポイントの値に変更された場合、ポイントコンバーターとしても機能します):

1 Twip = 1/1440インチ。 .NET GraphicsオブジェクトにはメソッドDpiXおよびDpiYがあり、これらを使用して1インチに含まれるピクセル数を判別できます。これらの測定値を使用して、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);
    }
}

これらのメソッドを使用するには、次のことを行う必要があります(CreateGraphicsDrawing.Graphicsオブジェクトを返すコンテキストにいると仮定します(ここではthisはフォームなので、CreateGraphicsFormのスーパークラスControl)から継承されます:

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

グラフィックオブジェクトを取得する方法のリストについては、 Graphicsクラスのドキュメント の「備考」セクションを参照してください。より完全なドキュメントはチュートリアルで利用可能です 方法:グラフィックオブジェクトの作成

最も簡単な方法の簡単な要約:

  • Control.CreateGraphics
  • paintイベントのPaintEventArgsには、そのGraphicsプロパティで使用可能なGraphicsがあります。
  • 画像をGraphics.FromImageに渡すと、その画像に描画できるGraphicsオブジェクトが返されます。 (注:実際の画像にtwipを使用することはほとんどありません)
28
Chris Pfohl

移行プロジェクトでは、組み込みの会話サポート機能を使用できます

Microsoft.visualbasic.compatibility.vb6.twipsperpixelx
Microsoft.visualbasic.compatibility.vb6.twipsperpixely
5
Jayesh

参考までに、Graphicsオブジェクトを要求する代わりにWin32APIを使用する別のC#バージョン:

using System.Runtime.InteropServices;

static class SomeUtils {

  public static int ConvertTwipsToPixels(int twips, MeasureDirection direction) {
    return (int)(((double)twips)*((double)GetPixperinch(direction))/1440.0);
  }

  public static int ConvertPixelsToTwips(int pixels, MeasureDirection direction) {
    return (int)((((double)pixels)*1440.0)/((double)GetPixperinch(direction)));
  }

  public static int GetPPI(MeasureDirection direction) {
    int ppi;
    IntPtr dc = GetDC(IntPtr.Zero);

    if (direction == MeasureDirection.Horizontal)
      ppi = GetDeviceCaps(dc, 88); //DEVICECAP LOGPIXELSX
    else
      ppi = GetDeviceCaps(dc, 90); //DEVICECAP LOGPIXELSY

    ReleaseDC(IntPtr.Zero, dc);
    return ppi;
  }

  [DllImport("user32.dll")]
  static extern IntPtr GetDC(IntPtr hWnd);

  [DllImport("user32.dll")]
  static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);

  [DllImport("gdi32.dll")]
  static extern int GetDeviceCaps(IntPtr hdc, int devCap);
}

public enum MeasureDirection {
  Horizontal,
  Vertical
}

ピクセルが常に正方形であるという保証はないため、MeasureDirectionを指定する必要があります(kbによる)。

参照: kb210590:ACC2000:Twipsをピクセルに変換する方法

4
Renaud Bompuis

私が知っている古い投稿ですが、ここに参考文献と上記の1440の答えのいくつかの数学があります...

Twipは単に1インチの_1/1440_番目ではありません。 twipはポイントの_1/20_です。

印刷可能なドキュメントで作業しているポイントは、通常、ポストスクリプト72dpiです。

_72dpi * 20Twips/Point = 1440twips_。

したがって、たとえばCrystalレポートを処理する場合、twipの幅は_15840_(およびマージンは0 twips)で、幅は11 inches (15840 / (72 * 20))になります。

96 dpiの画面密度に基づいて、レポートは次の画面に投稿されます。

1056px wide (96dpi * 11in = 1056px)

2
ShaneLS