8

ピクセルをインチに、またはその逆に変換しようとしています。DPI が必要であることは理解していますが、この情報を取得する方法がわかりません (たとえば、Graphicsオブジェクトがないため、それはオプションではありません)。

方法はありますか?

4

3 に答える 3

7

ビデオ デバイスでは、通常、この質問に対する答えはあまり正確ではありません。この理由を理解するための最も簡単な例は、プロジェクターです。出力解像度は、たとえば 1024x768 ですが、DPI は、スクリーンがプロジェクターの開口部からどれだけ離れているかによって異なります。たとえば、WPF は常に、ビデオ デバイスで 96 DPI を前提としています。

精度に関係なく回答が必要で、Graphics オブジェクトがない場合は、P/Invoke を使用して画面から作成し、そこから回答を得ることができます。

Single xDpi, yDpi;

IntPtr dc = GetDC(IntPtr.Zero);

using(Graphics g = Graphics.FromHdc(dc))
{
    xDpi = g.DpiX;
    yDpi = g.DpiY;
}

if (ReleaseDC(IntPtr.Zero) != 0)
{
    // GetLastError and handle...
}


[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr hwnd);    
[DllImport("user32.dll")]
private static extern Int32 ReleaseDC(IntPtr hwnd);
于 2009-01-23T23:38:07.787 に答える
6

物理的に、DPI を知らずに現実的な方法はありません。ピクセルは離散的であり、インチはそうではありません。モニターでインチを話している場合、DPI を計算するには、(少なくとも) 解像度 (およびピクセル縦横比) と表示可能なモニター領域のサイズを知る必要があります。 . 通常、解像度はどこかで取得できますが (私は C# や .NET のプログラマーではないため、そこではお手伝いできません)、モニターのサイズは通常利用できません。見積もりが十分である場合は、ユーザーにモニターのサイズ (つまり 21 インチなど) を入力してもらい、DPI を求めます。

(resX/DPI)^2 + (resY/DPI)^2 = screenDiagonal^2

与える(対角線と解像度を知っていると仮定して)

DPI = sqrt(resX^2+resY^2)/screenDiagonal

モニターが正確に 21 インチ (.. など) であることはなく、ピクセルの縦横比が正確に 1:1 になることはめったにないため、これは単なる推定値です。

用紙上のインチについて話している場合は、ごく当然のことながら、プリンターの DPI (または、より正確には、現在のプリンター設定) を知る必要があります。

于 2009-01-23T22:14:39.500 に答える
1

を呼び出すだけで Graphics オブジェクトを作成しthis.CreateGraphics()(またはより一般的にはControl.CreateGraphics())、ご存知のように DpiX および DpiY プロパティを使用できます。グラフィックス オブジェクトを作成した後は、破棄することを忘れないでください (理想的には Using ステートメントを使用して)。

WinForms を使用していない場合は、そのアプリケーションの種類をお知らせください。

于 2009-01-23T22:26:01.710 に答える