C#でピクセルをインチに、またはその逆に変換する
-
19-08-2019 - |
質問
ピクセルをインチに変換したり、ピクセルをインチに変換したりしています。 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 <!> quot;など)を入力してDPIを解決してもらいます:
(resX/DPI)^2 + (resY/DPI)^2 = screenDiagonal^2
与える(対角線と解像度がわかっていると仮定)
DPI = sqrt(resX^2+resY^2)/screenDiagonal
モニターは正確に21 <!> quot; (..または何でも)、およびピクセルアスペクト比はほとんど正確に1:1ではありません。
紙の上で何インチも話している場合、ごく自然にプリンターのDPI(または、より正確には、現在のプリンター設定)を知る必要があります。
単にthis.CreateGraphics()
(またはより一般的にはControl.CreateGraphics()
)を呼び出してGraphicsオブジェクトを作成し、ご存知のようにDpiXおよびDpiYプロパティを使用できます。グラフィックオブジェクトは、作成後に破棄することを忘れないでください(Usingステートメントを使用するのが理想的です)。
WinFormsを使用していない場合は、それがどのようなアプリケーションであるかをお知らせください。