ピクセルをインチに、またはその逆に変換しようとしています。DPI が必要であることは理解していますが、この情報を取得する方法がわかりません (たとえば、Graphics
オブジェクトがないため、それはオプションではありません)。
方法はありますか?
ピクセルをインチに、またはその逆に変換しようとしています。DPI が必要であることは理解していますが、この情報を取得する方法がわかりません (たとえば、Graphics
オブジェクトがないため、それはオプションではありません)。
方法はありますか?
ビデオ デバイスでは、通常、この質問に対する答えはあまり正確ではありません。この理由を理解するための最も簡単な例は、プロジェクターです。出力解像度は、たとえば 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);
物理的に、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 (または、より正確には、現在のプリンター設定) を知る必要があります。
を呼び出すだけで Graphics オブジェクトを作成しthis.CreateGraphics()
(またはより一般的にはControl.CreateGraphics()
)、ご存知のように DpiX および DpiY プロパティを使用できます。グラフィックス オブジェクトを作成した後は、破棄することを忘れないでください (理想的には Using ステートメントを使用して)。
WinForms を使用していない場合は、そのアプリケーションの種類をお知らせください。